《WooCommerce REST API的使用方法》描述了如何通过Nodejs使用WooCommerce REST API,本文在此基础上,加入react、bootstrap form,做一个简单展示订单信息的react app。
目录
安装新的依赖包
文件夹结构及配置过程请参考上一篇文章,在此基础上,打开命令行并运行如下命令
npm i react react-dom bootstrap react-bootstrap moment
react和react-dom是构建react app的核心包,bootstrap和react-bootstrap用来搭建UI,moment用来处理日期格式。
在src目录下新建一个style.css文件,并引入bootstrap样式,内容如下:
@import "bootstrap/dist/css/bootstrap.min.css";
更新index.html文件
在index.html里要引入style.css,并添加用来挂载react app的dom元素,如下所示:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="style.css">
<title>Document</title>
</head>
<body>
<div id="root"></div>
<script type="text/javascript" src="index.js"></script>
</body>
</html>
更新index.js文件
index.js文件不再是简单的调用woocommerce api,而要用react的方式来写,内容如下:
import React from 'react';
import { createRoot } from 'react-dom/client';
import { Table } from "react-bootstrap";
import { useEffect, useState } from "react";
import WooCommerceRestApi from "@woocommerce/woocommerce-rest-api";
import moment from "moment";
const api = new WooCommerceRestApi({
url: "https://testwc.local",
consumerKey: "ck_8df9067595bb0e5cd6d12aeb844f99b5ff3c8d7e",
consumerSecret: "cs_a46bf0f4571c6683f956af96348a8eff17175b86",
version: "wc/v3",
});
function App() {
const [orders, setOrders] = useState([]);
useEffect(() => {
fetchOrders();
}, []);
let fetchOrders = () => {
api
.get("orders", {
per_page: 20,
})
.then((response) => {
if (response.status === 200) {
setOrders(response.data);
}
})
.catch((error) => {});
};
return (
<div className="App">
<Table striped bordered hover>
<thead>
<tr>
<th>#</th>
<th>Date</th>
<th>Amount</th>
<th>Name</th>
<th>Email</th>
<th>Address</th>
</tr>
</thead>
<tbody>
{orders.map((order, index) => {
return (
<tr key={index}>
<td>{order.id}</td>
<td>{moment(order.date).format("YYYY-MM-DD")}</td>
<td>{order.total}</td>
<td>{order.billing && order.billing.first_name}</td>
<td>{order.billing && order.billing.email}</td>
<td>{order.billing && order.billing.address_1}</td>
</tr>
);
})}
</tbody>
</Table>
</div>
);
}
const domNode = document.getElementById('root');
const root = createRoot(domNode);
root.render(<App />);
更新esbuild的编译指令
新加入的style.css也要一起编译,另外编译index.js需要jsx的支持,所以将package.json中的bundle命令更新成:
"bundle": "esbuild --bundle --loader:.js=jsx --sourcemap src/index.js src/style.css --outdir=build"
最终效果
在命令行里运行npm run build
编译文件,在build目录下生成最终文件,并在此目录下启动python web server,使用命令py -m http.server
。最终效果如下图所示: