摘要:初學,擼一個熟悉熟悉基本語法,只有最簡單最簡單的功能。引入這個之后,我們可以直接使用一些簡單的組件,比如等,我們可以更加注重業務邏輯的實現。
初學React,擼一個TodoList熟悉熟悉基本語法,只有最簡單最簡單的功能。
如上圖所示,是一個最簡單的TodoList的樣子了,我們應該怎樣把它拆成一個個的組件呢?
在之前看來,可能就是這樣一個HTML結構:
React的核心思想是:封裝組件。
我們也可以按照這個思路來進行組件設計
組件設計從小到大,從內到外 ~
我是這樣進行設計的。
除去按鈕,input這些之外,是HTML中最小的元素,我們可以先每一個當成是一個最小的組件,也就是圖中橙色框的部分,它對應著每一條內容,我們先把它命名為TodoItem吧。
的父級元素是,那就把它看作一個組件唄,圖中位于上方的藍色部分,命名為TodoList。
恩,此時Todo內容的展示組件已經是夠的了,我們再來加一個添加Todo內容的組件AddTodoItem吧,命名貌似有點丑- -,圖中位于下方的藍色部分。
最后就是最外層的紅色部分了,它就是整個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"))
讓我們想想啊,對于每一條內容來說,需要什么呢?
一個確認是否完成的checkbox [ ]
一條內容text
一個刪除button
zzzzzz.....其他的暫時先不加了~
那不是太簡單了 ~
不不不,我們現在是在寫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 的組件庫,也歡迎社區其他框架的實現版本。
引入這個之后,我們可以直接使用一些簡單的UI組件,比如Row,Col,Checkbox,Button等,我們可以更加注重業務邏輯的實現。
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}
) } }
添加內容這個組件也比較簡單,就只需要一個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內容不得為空!", }); } else { this.props.saveNewItem(task) element.value = "" } } render() { return (TodoBox) } }
我們的小組件已經都實現了,拿一個大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": "學習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),不然內部this會指向不正確
源碼完整的Demo代碼在這:https://github.com/axuebin/react-todolist
原文地址:http://axuebin.com/blog/2017/...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/84384.html
摘要:盡管現在的已不再那么流行,但的設計思想還是非常值得致敬和學習的,特別是的插件化。那么,如何解決我們回顧下的生命周期,父組件傳遞到子組件的的更新數據可以在中獲取。當然,如何設計取決于你自己的項目,正所謂沒有最好的, 作者:曉冬本文原創,轉載請注明作者及出處 如今的 Web 前端已被 React、Vue 和 Angular 三分天下,一統江山十幾年的 jQuery 顯然已經很難滿足現在的開...
摘要:每當的值改變后,我們只需要重新調用方法即可現在,讓我們來實現一個類似風格的歸約函數,以不斷的遞增。歸約函數是不允許修改當前狀態的,所有最簡單的實現方式就是。 原文:Functional Components with React stateless functions and Ramda 閱讀本文需要的知識儲備: 函數式編程基本概念(組合、柯里化、透鏡) React 基本知識(組件、...
摘要:子組件中通過就可以拿到上的數據了,實現了從父組件子組件的數據傳遞。當前狀態改變時要發生的副作用。通過裝飾器調用的函數進行使用。理想情況下,大部分組件都應該是無狀態組件,僅通過獲得數據。通過調用中的改變狀態。 Todo-list 這是一個用來初步了解如何通過 React + Mobx 構建應用的 DEMO,通過 Webpack 進行打包。技術棧: React + Mobx + React...
摘要:而函數式編程就不一樣了,這是模仿我們人類的思維方式發明出來的。數據流在中,數據的流動是單向的,即從父節點傳遞到子節點。數據流嚴格的單向數據流是架構的設計核心。 前言 總括: 本文采用react+redux+react-router+less+es6+webpack,以實現一個簡易備忘錄(todolist)為例盡可能全面的講述使用react全家桶實現一個完整應用的過程。 代碼地址:Re...
閱讀 1648·2019-08-30 15:44
閱讀 2570·2019-08-30 11:19
閱讀 401·2019-08-30 11:06
閱讀 1565·2019-08-29 15:27
閱讀 3083·2019-08-29 13:44
閱讀 1628·2019-08-28 18:28
閱讀 2357·2019-08-28 18:17
閱讀 1986·2019-08-26 10:41