1、经典案例之 todoList
- 写一个最简单的内容
class TodoList extends Component { render() { return ( <> <div> <input /> <button>submit</button> </div> <ul> <li>打游戏</li> <li>学习</li> </ul> </> ); } } export default TodoList; 复制代码
- 效果是这样的
网络异常,图片无法展示
|
- 接下来 我想 输入内容 然后 submit 之后 放在下面,怎么办 ?
2、React 响应式思想及事件绑定
- 首先 React 不直接操作 DOM, 有个经典的公式 UX = F(data),视图来自于数据变化
- 所以 当前页面需要两部分数据,则需要定义两个数据
数据在哪里定义 ?
class TodoList extends Component { constructor(props) { super(props); this.state = { inputValue: "", toDoList: [], }; } handleInputChange = (e) => { this.setState({ inputValue: e.target.value, }); }; render() { return ( <> <div> <input value={this.state.inputValue} onChange={this.handleInputChange} /> <button>submit</button> </div> <ul> <li>打游戏</li> <li>学习</li> </ul> </> ); } } export default TodoList; 复制代码
- 需要注意几个地方
1、value 数据取决于 state里的 inputValue 2、不能使用 this.state.inputValue = xxx 这种形式改变 state 3、需要注意 绑定事件 this 指向问题,通常使用 bind / 箭头函数 () => {xx} 复制代码
3、新增和删除列表项
- 一个重要的内容 这部分不能固定,我们需要map 遍历数据展示内容
网络异常,图片无法展示
|
- 我们 还需要 点击 submit 之后 将内容 提交到下方
import React, { Component } from "react"; class TodoList extends Component { constructor(props) { super(props); this.state = { inputValue: "", toDoList: [], }; } handleInputChange = (e) => { this.setState({ inputValue: e.target.value, }); }; handleButtonClick = () => { this.setState({ toDoList: [...this.state.toDoList, this.state.inputValue], inputValue: "", }); }; render() { return ( <> <div> <input value={this.state.inputValue} onChange={this.handleInputChange} /> <button onClick={this.handleButtonClick}>submit</button> </div> <ul> {this.state.toDoList.map((item, index) => ( <li key={index}>{item}</li> ))} </ul> </> ); } } export default TodoList; 复制代码
- 实现效果
网络异常,图片无法展示
|
- 非常 nice !
- 删除功能 怎么实现 ?
- 拿到每一项 下标
网络异常,图片无法展示
|
网络异常,图片无法展示
|
4、组件的拆分和组件间传值
- 思路
1、先拆分成小项 2、父组件 通过属性给子组件传递内容,子组件通过 this.props.xxx 进行接收 3、并且 子组件 可以调用 父组件的方法(但需要注意 父组件传递方法时 需要进行 this 绑定操作,否则 会出错,将this 绑定自身 ) 复制代码
- 代码时刻
- ToDoItem.js
import React, { Component } from "react"; class ToDoItem extends Component { handleItem = () => { const { index, handleContentClick } = this.props; handleContentClick(index); }; render() { const { item } = this.props; return <div onClick={this.handleItem}>{item}</div>; } } export default ToDoItem; 复制代码
- 父组件引入使用
网络异常,图片无法展示
|
- 非常nice !
5、代码优化一下
0、return 里面的东西简化,将逻辑放到一个函数中 1、将bind 绑定 放到 constructor 中(就不移动了) 2、this.setState 更改为 函数写法 (有些作用) 3、map 便利 加 key (加了) 复制代码
网络异常,图片无法展示
|
网络异常,图片无法展示
|
- 注意 还有 prevState
网络异常,图片无法展示
|
网络异常,图片无法展示
|
6、关于 React 更多思考
1、声明式的开发方式
- 与之对应的是 命令式 编程方式 , 比如 jQ, 80% 的时间我们在操作dom 做具体的事情
- 声明式 编程,数据 驱动视图的变化, 要做的是对 数据的管理部分,组件自身的 状态 使用 state 管理,或者使用 redux 进行 联合式 管理方式
2、可以和其他框架一起使用
- 听起来挺神奇的事情, 最常规思想,怎么做到这一点呢 ?
网络异常,图片无法展示
|
3、组件化 思想
- 需要注意两件事情
1、组件都是 大写开头的,h5 标签小写字母开头 2、父子组件 通信方式 1、父 ---> 子 直接 props 传值 2、子 ---> 父 子组件想改变父组件方法怎么处理 ? 调用父组件传递来的方法,间接改变父组件的状态 复制代码
4、单向数据流 思想
- 为啥需要
单向数据流 ? 而且子组件绝对不能更改父组件传递来的数据
- 为了 使得数据管理正常,不会出现很多的 bug,比如当前有一个父组件给多个子组件传递了同一个数据,一个子组件更改了 传递的数据,则其他组件的数据也会更改,造成问题
网络异常,图片无法展示
|
网络异常,图片无法展示
|
5、视图层 框架
网络异常,图片无法展示
|
- 复杂的组件间的信息传递 交给 redux 这种 状态管理来实现
6、函数式编程
类似 constructor 生命 周期 和 其他的 handleXxxx 函数, renderXxxx 函数,都分成 不同的函数部分
,不同的函数模块,利于 更改维护和自动化测试- 比较重要的思想,
可以将函数功能分开, 一个函数做一件事情,并且可将复杂的函数进行拆分
撒花 🎉🎉🎉
更多项目请访问 github github.com/huanhunmao
gitee 项目地址 gitee.com/huanhunmao/…