摘要:初學(xué),擼一個熟悉熟悉基本語法,只有最簡單最簡單的功能。引入這個之后,我們可以直接使用一些簡單的組件,比如等,我們可以更加注重業(yè)務(wù)邏輯的實(shí)現(xiàn)。
初學(xué)React,擼一個TodoList熟悉熟悉基本語法,只有最簡單最簡單的功能。
如上圖所示,是一個最簡單的TodoList的樣子了,我們應(yīng)該怎樣把它拆成一個個的組件呢?
在之前看來,可能就是這樣一個HTML結(jié)構(gòu):
React的核心思想是:封裝組件。
我們也可以按照這個思路來進(jìn)行組件設(shè)計(jì)
組件設(shè)計(jì)從小到大,從內(nèi)到外 ~
我是這樣進(jìn)行設(shè)計(jì)的。
除去按鈕,input這些之外,是HTML中最小的元素,我們可以先每一個當(dāng)成是一個最小的組件,也就是圖中橙色框的部分,它對應(yīng)著每一條內(nèi)容,我們先把它命名為TodoItem吧。
的父級元素是,那就把它看作一個組件唄,圖中位于上方的藍(lán)色部分,命名為TodoList。
恩,此時Todo內(nèi)容的展示組件已經(jīng)是夠的了,我們再來加一個添加Todo內(nèi)容的組件AddTodoItem吧,命名貌似有點(diǎn)丑- -,圖中位于下方的藍(lán)色部分。
最后就是最外層的紅色部分了,它就是整個app的主體部分,包含著其它小組件,命名為TodoBox。
ok,暫時就這幾個小組件 ~
然我們開始愉快的擼代碼吧 ~
代碼部分 Index先看看入口程序,很簡單。
var React = require("react"); var ReactDOM = require("react-dom"); import TodoBox from "./components/todobox"; import "./../css/index.css"; export default class Index extends React.Component { constructor(){ super(); }; render() { return (TodoItem); } } ReactDOM.render( ,document.getElementById("example"))
讓我們想想啊,對于每一條內(nèi)容來說,需要什么呢?
一個確認(rèn)是否完成的checkbox [ ]
一條內(nèi)容text
一個刪除button
zzzzzz.....其他的暫時先不加了~
那不是太簡單了 ~
不不不,我們現(xiàn)在是在寫React,要這樣:
import React from "react"; import {Row, Col, Checkbox, Button} from "antd"; export default class TodoItem extends React.Component { constructor(props) { super(props) this.toggleComplete = this.toggleComplete.bind(this) this.deleteTask = this.deleteTask.bind(this) } toggleComplete() { this.props.toggleComplete(this.props.taskId) } deleteTask() { this.props.deleteTask(this.props.taskId) } render() { let task = this.props.task let itemChecked if (this.props.complete === "true") { task ={task}itemChecked = true } else { itemChecked = false } return (
import {Row, Col, Checkbox, Button} from "antd"是引入Ant Design。
我們采用 React 封裝了一套 Ant Design 的組件庫,也歡迎社區(qū)其他框架的實(shí)現(xiàn)版本。
引入這個之后,我們可以直接使用一些簡單的UI組件,比如Row,Col,Checkbox,Button等,我們可以更加注重業(yè)務(wù)邏輯的實(shí)現(xiàn)。
TodoList接下來就是拿一個把item包起來唄:
import React from "react"; import TodoItem from "./todoitem"; export default class TodoList extends React.Component{ constructor(props) { super(props); } render(){ var taskList=this.props.data.map(listItem=>AddTodoItem) return( {taskList}
) } }
添加內(nèi)容這個組件也比較簡單,就只需要一個input和一個button即可:
import React from "react"; import ReactDOM from "react-dom"; import {Row, Col, Form, Input, Button,notification } from "antd"; export default class AddTodoItem extends React.Component { constructor(props) { super(props) this.saveNewItem = this.saveNewItem.bind(this) } saveNewItem(e) { e.preventDefault() let element = ReactDOM.findDOMNode(this.refs.newItem) let task = element.value if (!task) { notification.open({ description: "Todo內(nèi)容不得為空!", }); } else { this.props.saveNewItem(task) element.value = "" } } render() { return (TodoBox) } }
我們的小組件已經(jīng)都實(shí)現(xiàn)了,拿一個大box包起來唄 ~
import React from "react"; import TodoList from "./todolist"; import AddTodoItem from "./addtodoitem"; import {Button, Icon, Row, Col} from "antd"; export default class TodoBox extends React.Component { constructor(props) { super(props) this.state = { data: [ { "id": "1", "task": "做一個TodoList Demo", "complete": "false" }, { "id": "2", "task": "學(xué)習(xí)ES6", "complete": "false" }, { "id": "3", "task": "Hello React", "complete": "true" }, { "id": "4", "task": "找工作", "complete": "false" } ] } this.handleToggleComplete = this.handleToggleComplete.bind(this); this.handleTaskDelete = this.handleTaskDelete.bind(this); this.handleAddTodoItem = this.handleAddTodoItem.bind(this); } generateGUID() { return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function(c) { var r = Math.random() * 16 | 0, v = c == "x" ? r : (r & 0x3 | 0x8) return v.toString(16) }) } handleToggleComplete(taskId) { let data = this.state.data; for (let item of data) { if (item.id === taskId) { item.complete = item.complete === "true" ? "false" : "true" } } this.setState({data}) } handleTaskDelete(taskId) { let data = this.state.data data = data.filter(task => task.id !== taskId) this.setState({data}) } handleAddTodoItem(task) { let newItem = { id: this.generateGUID(), task, complete: "false" } let data = this.state.data data = data.concat([newItem]) this.setState({data}) } render() { return () } }React TodoList
|
注意:
通過props傳遞子組件需要的值和方法
傳遞方法時一定要bind(this),不然內(nèi)部this會指向不正確
源碼完整的Demo代碼在這:https://github.com/axuebin/react-todolist
原文地址:http://axuebin.com/blog/2017/...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/84384.html
摘要:盡管現(xiàn)在的已不再那么流行,但的設(shè)計(jì)思想還是非常值得致敬和學(xué)習(xí)的,特別是的插件化。那么,如何解決我們回顧下的生命周期,父組件傳遞到子組件的的更新數(shù)據(jù)可以在中獲取。當(dāng)然,如何設(shè)計(jì)取決于你自己的項(xiàng)目,正所謂沒有最好的, 作者:曉冬本文原創(chuàng),轉(zhuǎn)載請注明作者及出處 如今的 Web 前端已被 React、Vue 和 Angular 三分天下,一統(tǒng)江山十幾年的 jQuery 顯然已經(jīng)很難滿足現(xiàn)在的開...
摘要:每當(dāng)?shù)闹蹈淖兒螅覀冎恍枰匦抡{(diào)用方法即可現(xiàn)在,讓我們來實(shí)現(xiàn)一個類似風(fēng)格的歸約函數(shù),以不斷的遞增。歸約函數(shù)是不允許修改當(dāng)前狀態(tài)的,所有最簡單的實(shí)現(xiàn)方式就是。 原文:Functional Components with React stateless functions and Ramda 閱讀本文需要的知識儲備: 函數(shù)式編程基本概念(組合、柯里化、透鏡) React 基本知識(組件、...
摘要:子組件中通過就可以拿到上的數(shù)據(jù)了,實(shí)現(xiàn)了從父組件子組件的數(shù)據(jù)傳遞。當(dāng)前狀態(tài)改變時要發(fā)生的副作用。通過裝飾器調(diào)用的函數(shù)進(jìn)行使用。理想情況下,大部分組件都應(yīng)該是無狀態(tài)組件,僅通過獲得數(shù)據(jù)。通過調(diào)用中的改變狀態(tài)。 Todo-list 這是一個用來初步了解如何通過 React + Mobx 構(gòu)建應(yīng)用的 DEMO,通過 Webpack 進(jìn)行打包。技術(shù)棧: React + Mobx + React...
摘要:而函數(shù)式編程就不一樣了,這是模仿我們?nèi)祟惖乃季S方式發(fā)明出來的。數(shù)據(jù)流在中,數(shù)據(jù)的流動是單向的,即從父節(jié)點(diǎn)傳遞到子節(jié)點(diǎn)。數(shù)據(jù)流嚴(yán)格的單向數(shù)據(jù)流是架構(gòu)的設(shè)計(jì)核心。 前言 總括: 本文采用react+redux+react-router+less+es6+webpack,以實(shí)現(xiàn)一個簡易備忘錄(todolist)為例盡可能全面的講述使用react全家桶實(shí)現(xiàn)一個完整應(yīng)用的過程。 代碼地址:Re...
閱讀 1650·2019-08-30 15:44
閱讀 2573·2019-08-30 11:19
閱讀 406·2019-08-30 11:06
閱讀 1567·2019-08-29 15:27
閱讀 3085·2019-08-29 13:44
閱讀 1629·2019-08-28 18:28
閱讀 2358·2019-08-28 18:17
閱讀 1987·2019-08-26 10:41