摘要:在裝載組件之前調(diào)用會組件的構(gòu)造函數(shù)。當(dāng)實(shí)現(xiàn)子類的構(gòu)造函數(shù)時,應(yīng)該在任何其他語句之前調(diào)用設(shè)置初始狀態(tài)綁定鍵盤回車事件,添加新任務(wù)修改狀態(tài)值,每次修改以后,自動調(diào)用方法,再次渲染組件??梢酝ㄟ^直接安裝到項(xiàng)目中,使用或進(jìn)行引用。
首先我們看一下我們完成后的最終形態(tài):TodoMvc:
學(xué)習(xí)必要條件:略懂node.js,略懂ES6,然后你的電腦必須安裝有較新版本node,沒有的同學(xué)趕緊安裝。
好了,廢話不多說,直接開始。
第一部分源碼:todoMvc-1step
webpack的配置 1. 介紹:Webpack?是當(dāng)下最熱門的前端資源模塊化管理和打包工具。詳細(xì)見官網(wǎng)
2. 安裝:$ npm install webpack -g
此時 Webpack 已經(jīng)安裝到了全局環(huán)境下,可以通過命令行 webpack -h 試試。但通常我們會將 Webpack 以及相關(guān)依賴以這種方式安裝,如下:
# 進(jìn)入項(xiàng)目目錄 # 確定已經(jīng)有 package.json,沒有就通過 npm init 創(chuàng)建 # 安裝 webpack 依賴 $ npm install webpack --save-dev # 安裝react.js依賴(i是install的簡寫,-S是--save的簡寫) $ npm i react react-dom -S
剩余的依賴組件參照我源碼中的package.json的依賴添加就好。最終,我們得到的package.json應(yīng)該如下圖:確保紅框中的內(nèi)容一樣即可。
3. 配置現(xiàn)在我們已經(jīng)安裝好了依賴,下面我們需要先把項(xiàng)目的目錄建好:
. ├── node_modules # npm install 安裝的東西都跑著里面來了 ├── src ├── components ├── app.js # react組件 ├── styles ├── main.styl # stylus文件(類似于sass) ├── entry.js # 入口js文件 ├── index.html # 入口頁面 ├── package.json # 項(xiàng)目描述文件(內(nèi)有相關(guān)依賴) └── webpack.config.js # webpack配置文件
然后我們在webpack.config.js中添加配置:
module.exports = { entry: [ "./src/entry.js" ], output: { path: "./out/", filename: "bundle.js" }, module: { loaders: [ { test: /.js[x]?$/, loader: "babel-loader?presets[]=es2015&presets[]=react", include: /src/}, { test: /.css$/, loader: "style!css"}, { test: /.styl$/, loader: "style-loader!css-loader!stylus-loader"}, { test: /.(png|jpg)$/, loader: "url?limit=8192"} ] } }
配置文件將我們的入口文件entry.js打包輸出到 ./out/bundle.js,我們直接在頁面index.html中引入bundle.js就好了。
不懂得話可以參考webpack的文檔:webpack-usage 和 webpack-loader。關(guān)于/src目錄下的文件內(nèi)容可以直接到源碼中查看。然后就可以小試牛刀啦,在終端中輸入:
$ webpack
然后我們看到我們的目錄下多了個./out/bundle.js文件,然后我們在瀏覽器打開目錄下的index.html文件可以看到內(nèi)容并alert("success")那么恭喜你,第一步圓滿完成!
React如何雙向綁定todoMvc-2step源碼
todoMvc-2step演示
上一章主要說了下react+webpack的環(huán)境搭建,這一章主要講一下如何雙向綁定。對vue和angular略有了解的都知道,這兩個框架都是支持雙向綁定的,而react是單向綁定的,知乎有一篇關(guān)于單向綁定和雙向綁定可以拓展一下:單向數(shù)據(jù)綁定和雙向數(shù)據(jù)綁定的優(yōu)缺點(diǎn),適合什么場景。下面分析如何具體實(shí)現(xiàn):
進(jìn)入我們的app.js文件,在之前我們搭建環(huán)境的時候已經(jīng)安裝了react相關(guān)的依賴以及babel編譯工具,所以我們可以直接在這里使用ES6、JSX語法。
import React from "react" import ReactDOM from "react-dom"
其中,react.js 是 React 的核心庫,react-dom.js 是提供與 DOM 相關(guān)的功能。
2. 生成組件先介紹react三個比較重要的知識點(diǎn):
1.ReactDOM.render()
ReactDOM.render 是 React 的最基本方法,用于將模板轉(zhuǎn)為 HTML 語言,并插入指定的 DOM 節(jié)點(diǎn)。舉個例子:
ReactDOM.render(Hello, world!
, document.getElementById("example") );
上面代碼將一個 h1 標(biāo)題,插入 example 節(jié)點(diǎn)。
2.JSX 語法
HTML 語言直接寫在 JavaScript 語言之中,不加任何引號,這就是?JSX 的語法,它允許 HTML 與 JavaScript 的混寫,上面的Hello, world!
,就是使用了jsx語法。
3.組件
React 允許將代碼封裝成組件(component),然后像插入普通 HTML 標(biāo)簽一樣,在網(wǎng)頁中插入這個組件。React.createClass 方法就用于生成一個組件類。舉個?:
//es5寫法 var HelloMessage = React.createClass({ render: function() { returnHello React
; } }); //es6寫法 Class HelloMessage extends React.Component { render() { returnHello, React; } }
當(dāng)然,這里的HelloMessage我們也可以當(dāng)做HTML標(biāo)簽用ReactDOM.render()渲染出來。
app.js:
class App extends React.Component { //定義組件,繼承父類 constructor() {//constructor 是和 class 一起用來創(chuàng)建和初始化對象的特殊方法。 super()//在裝載組件(mounting)之前調(diào)用會React組件的構(gòu)造函數(shù)。當(dāng)實(shí)現(xiàn)React.Component子類的構(gòu)造函數(shù)時,應(yīng)該在任何其他語句之前調(diào)用super(props) this.state = {//設(shè)置初始狀態(tài) todos: [] } } // 綁定鍵盤回車事件,添加新任務(wù) handlerKeyUp(e) { if(e.keyCode == 13) { let value = e.target.value; if(!value) return false; let newTodoItem = { text: value, isDone: false }; e.target.value = ""; this.state.todos.push(newTodoItem) this.setState({todos: this.state.todos}); //修改狀態(tài)值,每次修改以后,自動調(diào)用 this.render 方法,再次渲染組件。 } } render(){ return (3. 測試) } } ReactDOM.render({this.state.todos.map((todo,index) => {{ return (
- {todo.text}
//Keys help React identify which items have changed, are added, or are removed. Keys should be given to the elements inside the array to give the elements a stable identity ) }})},document.getElementById("app"))
運(yùn)行
$ webpack
然后打開index.html,如果可以在input輸入,按下回車可以在下方生成list
那么恭喜你,雙向綁定功能完成!
組件化todoMvc-3step源碼
todoMvc-3step演示
上一章主要介紹了下React如何進(jìn)行雙向綁定以及如何生成一個組件,我們第三步的目標(biāo)就是需要把之前做的內(nèi)容抽象出更細(xì)的組件,這樣便于解耦,各個組件各司其職,互不干擾。
先看下抽象后src/components下的目錄
先看下我們的app.js修改過后的內(nèi)容:
import React from "react" import ReactDOM from "react-dom" import TodoHeader from "./TodoHeader" // 引入TodoHeader組件 import TodoMain from "./TodoMain" // 引入TodoMain組件 class App extends React.Component { // 定義組件,繼承父類 constructor() { super() this.state = { todos: [] } } addTodo(item) { // 新增了添加todo事項(xiàng)的方法 this.state.todos.push(item) this.setState({todos: this.state.todos}); //設(shè)置狀態(tài) } render(){ return (// 將原內(nèi)容寫在組件中并引入進(jìn)行渲染 // 把a(bǔ)ddTodo方法傳遞到TodoHeader組件中,bind(this)是為了把該React實(shí)例綁定到this上) } } ReactDOM.render(// 把 state.todos 傳入到TodoMain 中 ,document.getElementById("app"))
TodoHeader:
import React from "react" class TodoHeader extends React.Component { // 綁定鍵盤回車事件,添加新任務(wù) handlerKeyUp(e) { if(e.keyCode == 13) { // enter鍵的 keyCode 為13 let value = e.target.value; if(!value) return false; let newTodoItem = { text: value, isDone: false }; e.target.value = ""; this.props.addTodo(newTodoItem) // 通過 this.props 來調(diào)用父組件傳遞過來的addTodo方法 } } render(){ return () } } export default TodoHeader // 將TodoHeader導(dǎo)出,否則父組件無法導(dǎo)入
TodoMain修改后內(nèi)容:
import React from "react" import TodoItem from "./TodoItem" class TodoMain extends React.Component { render(){ if(this.props.todos.length == 0) { return (恭喜您,目前沒有待辦任務(wù)) } else { return (
TodoItem:
import React from "react" class TodoItem extends React.Component { render() { let className = this.props.isDone?"task-done":"" return (
這一步時webpack先編譯,然后打開index.html,如果頁面像下圖這樣的odoMvc-3step演示,那就說明成功了。
做到這里應(yīng)該對react組件組件化的有個大概的了解了。新手們基本可以對著源碼按照這種思路繼續(xù)做下去。以完善【刪除】、【清除已完成】、【未完成數(shù)量】等功能了,由于代碼類似,故不做贅述了,不太清楚的地方可以參考源碼。
AntdtodoMvc-4step源碼
todoMvc-4step演示
這一章主要以【刪除】鍵為例講一下如何使用以?React?封裝了一套 Ant Design 的組件庫:
1. 安裝推薦使用 npm 的方式進(jìn)行開發(fā),不僅可在開發(fā)環(huán)境輕松調(diào)試,也可放心地在生產(chǎn)環(huán)境打包部署使用,享受整個生態(tài)圈和工具鏈帶來的諸多好處。
可以通過 npm 直接安裝到項(xiàng)目中,使用 import 或 require 進(jìn)行引用。
$ npm install antd --save2. 加載
可以通過以下的寫法來按需加載組件。
import Button from "antd/lib/button"; import "antd/lib/button/style"; // 或者 antd/lib/button/style/css 加載 css 文件
但我推薦使用更簡便的寫法:
首先需要安裝babel-plugin-import?依賴
$ npm install babel-plugin-import --save-dev
然后在我們的根目錄下新建.babelrc:
{ "plugins": [["import", {"libraryName": "antd", "style": "css"}]] //import js and css modularly }
這時我們需要什么UI組件,即可如下這么寫以達(dá)到按需加載js和css:
import { Button } from "antd";3. 使用
由于Antd組件已經(jīng)油React封裝好了,用法和原生html標(biāo)簽沒差:
剩余的樣式我們就可以對著antd components的demo來開發(fā)。
使用leancloud登錄注冊todoMvc-5step源碼
todoMvc-5step演示
這一章主要將上一章已經(jīng)成型的TodoMvc增加【注冊】、【登陸】、【數(shù)據(jù)儲存】的功能,這里我們把數(shù)據(jù)保存到leancloud。
1. 創(chuàng)建 LeanCloud 賬戶你需要去?https://leancloud.cn?創(chuàng)建一個賬戶。
創(chuàng)建成功后,你需要驗(yàn)證你的郵箱,否則無法創(chuàng)建應(yīng)用。
如下圖操作:
創(chuàng)建成功后就放在那里,因?yàn)榻酉聛砦覀円凑?LeanCloud 的「JavaScript SDK 文檔」來開發(fā)登錄、注冊功能。
登陸和注冊的頁面同樣也以組件的形式多帶帶抽離出來,樣式如圖:
組件Login.js代碼如下:
import React from "react" import { Form, Icon, Input, Button } from "antd"; const FormItem = Form.Item; const Login = Form.create()(React.createClass({ handleSubmit(e) { // 提交操作 e.preventDefault(); this.props.form.validateFields((err, values) => { if (!err) { this.props.loginOrSignUp(values) } }); }, render() { const { getFieldDecorator } = this.props.form; let text = this.props.value == 1 ?"注冊":"登陸" // 判斷“登陸”或者注冊功能 return (); }, })); export default Login
在app.js中做判斷,如果已登錄,則顯示ToDo應(yīng)用界面,否則顯示登陸界面:
render(){ if (!this.state.currentUser){ // 判斷是否已經(jīng)登錄 const RadioGroup = Radio.Group; return (4. 注冊&登陸) } else { let info = { isAllChecked: this.state.isAllChecked, todoCount: this.state.todos.length || 0, todoDoneCount: (this.state.todos && this.state.todos.filter((todo) => todo.isDone)).length || 0 } return (React-Todos
注冊 登入 ) } }
1.安裝 LeanCloud SDK
https://leancloud.cn/docs/sdk_setup-js.html
$ npm install leancloud-storage --save
2.初始化
https://leancloud.cn/docs/sdk_setup-js.html#初始化
app.js:
import AV from "leancloud-storage" const appId = "XXXXXXXXXXXXXXXXXXXXXX" //這里的appId就是剛才我們創(chuàng)建的應(yīng)用的Id,每個人都不一樣 const appKey = "XXXXXXXXXXXXXXXXXXX"; AV.init({ appId, appKey });
3.寫入注冊登陸的方法
我們先要通讀一下 LeanCloud?關(guān)于注冊的文檔,然后按照里面的demo去做修改。
app.js:
//登陸或者注冊 loginOrSignUp(values){ //判斷是登陸還是注冊 if (this.state.value === 1){ let user = new AV.User(); user.setUsername(values.userName); user.setPassword(values.password); user.signUp().then((loginedUser) => { this.state.currentUser = this.getCurrentUser() this.setState({currentUser: this.state.currentUser}) }, function (error) { alert("注冊失敗") }) } else if (this.state.value === 2){ console.log("執(zhí)行登陸") AV.User.logIn(values.userName, values.password).then((loginedUser) => { this.state.currentUser = this.getCurrentUser() this.setState({currentUser: this.state.currentUser}) this.fetchTodos() }, function (error) { alert("登陸失敗") }); } }
下面還需要去做【登出】、【保存Todo】等功能。這里我就不貼出來代碼了,可以直接去github上面去看我的app.js源碼。
至此,我們React+Webpack+Antd 的一個TodoMVC的思路就講解完畢了。希望能幫助小伙伴。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/81915.html
項(xiàng)目開始前,我們先聊一聊關(guān)于項(xiàng)目的一些說明。該項(xiàng)目起始于2017年初,當(dāng)時公司主要技術(shù)棧為gulp+angular,鑒于react的火熱的生態(tài),在公司決定研發(fā)bss管理系統(tǒng)時選用react開發(fā),目的也是為react native打下基礎(chǔ),以解決后期公司大前端技術(shù)棧的逐步成熟。(當(dāng)時沒有選擇vue開發(fā)的主要原因是weex生態(tài)還不夠特別成熟),既然決定換新,項(xiàng)目的構(gòu)建也跟著一起換,從gulp轉(zhuǎn)向火熱的...
摘要:新的項(xiàng)目目錄設(shè)計(jì)如下放置靜態(tài)文件業(yè)務(wù)組件入口文件數(shù)據(jù)模型定義數(shù)據(jù)定義工具函數(shù)其中數(shù)據(jù)流實(shí)踐的核心概念就是數(shù)據(jù)模型和數(shù)據(jù)儲存。最后再吃我一發(fā)安利是阿里云業(yè)務(wù)運(yùn)營事業(yè)部前端團(tuán)隊(duì)開源的前端構(gòu)建和工程化工具。 本文首發(fā)于阿里云前端dawn團(tuán)隊(duì)專欄。 項(xiàng)目在最初應(yīng)用 MobX 時,對較為復(fù)雜的多人協(xié)作項(xiàng)目的數(shù)據(jù)流管理方案沒有一個優(yōu)雅的解決方案,通過對MobX官方文檔中針對大型可維護(hù)項(xiàng)目最佳實(shí)踐的...
摘要:寫在前面準(zhǔn)備學(xué)習(xí)一下和相關(guān)的東西,官方的腳手架看起來太繁瑣,所以打算自己來搭建一個,參考了這個文檔從零搭建全家桶框架教程步驟上都差不多第一步,依賴總覽完成到我現(xiàn)在半成品的過程中,目前完成開發(fā)模式的相關(guān)操作,添加了按需加載的地步。 寫在前面 準(zhǔn)備學(xué)習(xí)一下react和webpack相關(guān)的東西,官方的腳手架看起來太繁瑣,所以打算自己來搭建一個,參考了這個文檔從零搭建React全家桶框架教程;...
摘要:基礎(chǔ)知識使用腳手架創(chuàng)建項(xiàng)目并啟動安裝腳手架使用腳手架創(chuàng)建項(xiàng)目為項(xiàng)目名。否則可能導(dǎo)致項(xiàng)目發(fā)布上線后,報錯無法執(zhí)行。安裝測試使用注意默認(rèn)情況下安裝的需要引入才會生效樣式,但很多時候,我們只是使用了部分組件,引入整個樣式文件,有些得不償失。 showImg(http://upload-images.jianshu.io/upload_images/2774022-8d65190f1b972c...
摘要:但在中,這一問題該如何解決呢使用遇到的問題如何自定義模塊文件后綴名的優(yōu)先級和一樣,也提供了一個叫的配置選項(xiàng),用于設(shè)定模塊文件的后綴名及其優(yōu)先級。 antd-mobile是螞蟻金服出的移動端設(shè)計(jì)指南和前端框架,它提供了一套基于React的移動端組件庫,可以很方便地用來開發(fā)體驗(yàn)良好的移動應(yīng)用。 使用antd-mobile遇到的問題:react-native模塊找不到 在閱讀了antd-mo...
閱讀 3632·2021-11-24 10:22
閱讀 3701·2021-11-22 09:34
閱讀 2502·2021-11-15 11:39
閱讀 1537·2021-10-14 09:42
閱讀 3672·2021-10-08 10:04
閱讀 1565·2019-08-30 15:52
閱讀 858·2019-08-30 13:49
閱讀 3028·2019-08-30 11:21