1. React父子组件通信
1.1 父亲给孩子传递参数
1 | return (<div> |
1.2 孩子给父亲传递参数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 > // 父亲中用来接收参数的函数
> getChild = (obj) => {
> const id = this.state.CommentList.length + 1;
> console.log()
> obj.id = id;
> console.log("父亲接收数据的方法",obj);
> this.setState((state) =>({
> CommentList :[obj,...this.state.CommentList] ★★
> // 用来添加到数组,
> }))
> }
> // 父亲中的子组件的使用
> return (<div>
> App
> <CMTItem func={reload}></CMTItem>
> </div>)
>
> // 按钮绑定的函数用来传递数据
> postComment = () => {
> var obj = {}
> obj.user = this.refs.user.value
> obj.content = this.refs.content.value
> console.log(obj)
> if(this.refs.user.value&& this.refs.content.value){
> this.props.func(obj); ★
> }
> this.refs.user.value = this.refs.content.value =""
> }
>
1.3 Context的跨层传递
- 使用要点:1.保证父子组件必须是类组件 ★
1 | //这个方法用于给子孙组件传递数据 (数据的跨层传递) |
- 定义向子孙组件传递的数据的类型
1 | static childContextTypes = { |
- 子组件在使用父组件context数据的时候首先需要对父组件传递过来的数据做类型校验
1 | render(){ |
2. react 组件的生命周期
2.1 对比 vue 的生命周期
1 | Vue生命周期: |
2.2 react 生命周期的介绍
- React组件的生命周期分为三个阶段:组件的创建阶段、组件的运行阶段、组件的销毁阶段
a. 创建阶段
1. static defaultProps
1 | // 在封装一个组件的时候,组件内部肯定有一些数据是必须的,哪怕用户没有传递一些相关的启动参数,这时候组件内部尽量给自己提供一个默认值; |
1 | import ReactTypes from "prop-types" |
- 如果有些数据是必须的,必须要有初始值,但是没有传递,就可以使用 static
2.constructor
1 | //2.生命周期第二个执行的是constructor 构造函数 (执行一次) |
3. componentWillMount
1 | //3.当子组件接收到新的props会执行,在react16.4版本以后,setState修改state数据之后也会触发这个方法(执行多次) |
4.render (){}
1 | //4.创建虚拟dom,但是虚拟dom还没有挂载到页面 (执行多次) |
5.componentDidMount
虚拟 dom 已经挂载到页面,此时可以获取到最新的页面(执行一次)
1 | //5.虚拟dom已经挂载到页面,此时可以获取到最新的页面 (执行一次) |
b. 运行阶段
1.static getDerivedStateFromProps
1 | 第一个会执行:static getDerivedStateFromProps |
2.shouldComponentUpdate
1 | // 第二个会执行: shouldComponentUpdate |
3.render
1 | //第三个会执行:render 此时会重新构建虚拟dom,但是新的虚拟dom还没有渲染到页面 |
4.getSnapshotBeforeUpdate
1 | //第四个会执行getSnapshotBeforeUpdate 函数 |
5.componentDidUpdate ★★
1 | // 在该方法中不能通过this.setSate来修改state数据 |
c . 销毁阶段
1. componentWillUnmount()
1 | //很关键的,我们获取当前rootNode的scrollHeight,传到componentDidUpdate 的参数perScrollHeight |