[TOC]
组件的state
设置合适的state
state里面适用于放置一些与页面渲染UI有关的状态集,其他的属性可以直接绑定在this上。
1 | import React, { Component } from 'react'; |
timer作为普通属性,直接挂载在this上。
state更新
一个合并的过程,只需要传入发生改变的state,它会与之前组建中的其他状态合并。
state更新是异步的
修改state的正确方式
使用this.state.date = new Date();
这种方式修改状态,不会触发render,页面上的状态不会被更新。
1 | import React, { Component } from 'react'; |
所以还是要使用this.setState({ date: new Date() });
。
当state的某个状态发生改变的时候,应该要重新创建这个状态,而不是直接修改原来的状态。
1 | import React, { Component } from 'react'; |
对不同的数据类型,使用不同的方式重新创建状态对象。
组件通信
父组件向子组件通信
父组件
1 | import React, { Component } from 'react'; |
子组件
1 | import React, { Component } from 'react'; |
父组件向子组件通信方式:通过props传递数据。
子组件向父组件通信
父组件
1 | import React, { Component } from 'react'; |
父组件通过props传递进回调函数
子组件
1 | import React, { Component } from 'react'; |
子组件更新状态调用父组件传递进的cb方法
子组件向父组件通信方式:父组件通过props传入回调函数,子组件调用回调函数通知父组件。
兄弟组件通信
B和C是兄弟组件,它们拥有共同的父组件
方式一:props
父组件PostList
1 | import React, { Component } from 'react'; |
1)请求数据之后改变状态集中user的值
2)新增的状态集中的index用来标识选中列表哪一项的下标
3)新增choose方法,传入子组件,用于更新选中列表的下标
4)传入Detail组件desc数据
子组件PostItem
1 | import React, { Component } from 'react'; |
1)choose方法,调用父组件传入的choose方法,更新父组件状态集中的index的值
2)设置选中状态的类名
3)引入postItem.css模块
子组件Detail
1 | import React from 'react'; |
1)它不用维护自身的状态,所以使用函数组件
postItem.css
1 | .choosed{ |
方式二:Context
postList.js
1 | import React, { Component } from 'react'; |
1)新增了一个静态childContextTypes对象属性
2)返回Context对象,约定好方法名
postItem.js
1 | import React, { Component } from 'react'; |
1)新增一个静态contextTypes属性
2)访问父组件的Context对象的属性
兄弟组件之间通信方式:子组件通过父组件传入的props里的回调通知父组件更新状态集,会调用render方法,重新传入另一个子组件新的props。
ref
可以用来获取DOM元素,或者组件的实例
在DOM上使用ref
ref接收一个回调函数作为值,在调用这个回调函数的时候,这个DOM元素会被当作回调函数的参数。
1 | import React,{Component} from 'react'; |
选择在componentDidMount
的时候调用focus方法,因为这个生命周期的时候,组件已经挂载到DOM上了。可以进行DOM操作。
在组件上使用ref
1)类组件
回调函数接受的参数是当前组件的实例
父组件
1 | import React,{Component} from 'react'; |
this.inputComponent就是子组件的实例,所以能调用到子组件的原型方法
子组件
1 | import React,{Component} from 'react'; |
子组件声明了一个focus方法,让父组件通过子组件实例去调用
2)函数组件
函数组件定义ref是不生效的!!!函数组件定义ref是不生效的!!!函数组件定义ref是不生效的!!!
示例:
父组件
1 | import React,{Component} from 'react'; |
子组件
1 | import React, { Component } from 'react'; |
顺便说个小问题
当我注释了引入React的时候,报错了,为什么呢。
通过Babel编译可以看到React.createElement
,JSX的语法会编译成这个,最后转成一个reactElement。所以注释了引入React就报错了。
父组件访问子组件的DOM节点
父组件
1 | import React,{Component} from 'react'; |
子组件
1 | import React,{Component} from 'react'; |
####