用 React 完成一個 todolist
嘗試一下之前沒有接觸過的框架: React。
項目代碼鏈接:GitHub
項目預覽鏈接:Git Pages
測試賬號:123
測試密碼:456
通過使用 react 完成一個 TODOList,具有以下功能:
1.可以注冊並登錄,PC和移動端都可以使用
2.可以添加/刪除 todo 選項
3.標記 todo 已完成
4.展示 todo 列表
項目初始化
1.首先全局安裝 react:cnpm i create-react-app
2.進入項目目錄下輸入:create-react-app react-todolist
(熟悉 vue-cli 的話他的作用和 vue init webpack xxx
是一樣的)
3.進入項目目錄,運行 cnpm start
,然后他就會自動打開 http://localhost:3000/
一個 react 項目就初步構建並可以運行了:
項目目錄
來看看運行命令后我們得到了一個什么樣的項目骨架:
.
│ .gitignore
│ package-lock.json
│ package.json // 用於記錄項目及引用庫信息
│ README.md
├─public // 用於存放靜態資源
│ favicon.ico
│ index.html
│ manifest.json
│
└─src // 用於存放所有源代碼
App.css
App.js
App.test.js
index.css
index.js // 項目主入口
logo.svg
serviceWorker.js
在 package.json 中還配置了相關的 npm 腳本:
"scripts": {
"start": "react-scripts start", // 執行 npm start ,相當於 vue-cli 中的 npm run dev,webpack 熱啟動
"build": "react-scripts build", // 執行 npm build,相當於 vue-cli 中的 npm run build,打包構建文件
},
執行 npm build
后,項目會生成一個 build 文件夾(相當於 vue-cli build 后生成的 dist,存放用於發布的內容):
build
├── asset-manifest.json
├── favicon.ico
├── index.html
└── static
├── css
│ ├── main.9a0fe4f1.css
│ └── main.9a0fe4f1.css.map
├── js
│ ├── main.19e75c9e.js
│ └── main.19e75c9e.js.map
└── media
└── logo.5d5d9eef.svg
Hello World
在項目目錄下的 src/index.js 文件中修改:
// before
ReactDOM.render(<App />, document.getElementById('root'));
// after
ReactDOM.render(
<h1>Hello, world!</h1>,
document.getElementById('root')
);
再看看 http://localhost:3000/ ,我們已經用 react 成功寫出了「Hello World」。
在 public/index.html 中,有一個 id 為 「root」 的 div 節點,代碼的作用,就是將 h1
標簽及其內容插入到這個節點中,所以我們才能看到「Hello World」
部署
如果要把 react 項目部署到 GitHub Pages 的話,需要:
1.把 .gitignore 里的 build 一行刪除
2.在 package.json 中添加: "homepage": "https://no1harm.github.io/react-todolist/build"
(后面的值為 gitpages 鏈接地址 + /build)
3.運行 cnpm build
4.重新 push 上 GitHub,可以看到項目的正常預覽了。
入門 / 熟悉基本概念
注意:
setState不會立刻改變React組件中state的值
函數式的setState用法,如:
function increment(state, props) {
return {count: state.count + 1};
}
function incrementMultiple() {
this.setState(increment);
this.setState(increment);
this.setState(increment);
}
>同樣是把狀態中的count加1,但是狀態的來源不是this.state,而是輸入參數state
具體可參見這里:setState
-
改變 state:commit
React 的生命周期包括三個階段:mount(掛載)、update(更新)和 unmount(移除)
mount:第一次讓組件出現在頁面中的過程。這個過程的關鍵就是 render 方法。React 會將 render 的返回值(一般是虛擬 DOM,也可以是 DOM 或者 null)插入到頁面中。
其中的鈎子函數:
constructor()
componentWillMount()
render()
componentDidMount()
update:mount 之后,如果數據有任何變動,就會來到 update 過程
其中鈎子函數:
componentWillReceiveProps(nextProps) - 我要讀取 props 啦!
shouldComponentUpdate(nextProps, nextState) - 請問要不要更新組件?true / false
componentWillUpdate() - 我要更新組件啦!
render() - 更新!
componentDidUpdate() - 更新完畢啦!
unmount:當一個組件將要從頁面中移除時,會進入 unmount 過程
其中鈎子函數:
componentWillUnmount()
生命周期: commit
- setState
在對應報錯信息,逐漸刪除在生命周期鈎子中的 setState 后,得出結論:
一般只在這幾個鈎子里 setState:
componentWillMount
componentDidMount
componentWillReceiveProps
antd
問題:使用 antd 中的 Form .onSubmit 方法無效:
點擊提交按鈕,如果沒有執行 回調函數,原因是按鈕需要包含在 form 表單內並且設置 htmlType={“submit”}。
點擊提交未報錯設置的 rules 未進行判斷是因為在 handleSubmit 內要設置 form.validateFields 進行域名校驗。
因為之前使用的框架是 Vue,對 react 遠談不上了解,可能是先入為主的原因,個人還是比較喜歡 Vue(因為對新人比較友好,文檔也很全面。寫得順手了,用起 react 來竟然是有點無所適從…
不過這個 TODOList 總算是完成了,也算是對 react 有了一點粗淺的認知吧。