官网地址:https://zh-hans.reactjs.org/docs/react-component.html#setstate (setstate)
https://zh-hans.reactjs.org/docs/react-dom.html#finddomnode (finddomnode)
参考博客:https://itbilu.com/javascript/react/EkACBdqKe.html
1、设置状态:setState(在组件中调用)
(1)格式
setState(updater[, callback])
参数说明:
updater,将要设置的新状态,该状态会和当前的state合并。
callback,可选参数,回调函数。该函数会在setState设置成功,且组件重新渲染后调用。
合并updater和当前state,并重新渲染组件。setState是React事件处理函数中和请求回调函数中触发UI更新的主要方法。
(2)特性
1)会批量推迟更新
目的:提升性能;保持内部一致
原因:setState() 将组件state的更改排入队列,并通知React需要使用更新后的state重新渲染此组件及其子组件。但React 将 setState 视为请求,而不是立即更新组件的命令;
隐患:React 并不会保证 state 的变更会立即生效,调用setState后立即读取this.state,值尚未及时更新;
对策:
- 使用componentDidUpdate
- 使用setState的回调函数 setState(updater, callback)
例:
export default class Counter extends React.Component{ constructor(props) { super(props); this.state = {clickCount: 0}; } handleClick() { this.setState(function(state) { return {clickCount: state.clickCount + 1}; }); } render () { return (<h2 onClick={this.handleClick.bind(this)}>点我!点击次数为: {this.state.clickCount}</h2>); } }
以上两种方法都可以保证在应用更新后触发
(3)根据之前的state设置当前state(事实上,这一点我也不理解)
除非 shouldComponentUpdate()
返回 false
,否则 setState()
将始终执行重新渲染操作。如果可变对象被使用,且无法在 shouldComponentUpdate()
中实现条件渲染,那么仅在新旧状态不一时调用 setState()
可以避免不必要的重新渲染
例:
export default class IndexCom extends React.Component { constructor(props) { super(props); this.state = { counter: 123 } } shouldComponentUpdate() { return false } handClick() { this.setState((state, props) => { return {counter: state.counter + props.increment}; }); console.log(this.state.counter) } render() { return( <div onClick={this.handClick.bind(this)}> 点我加{this.state.counter} </div> ) } }
此时,无论你点击多少次,state的值发生的变化,但是页面不会重新渲染。
2、强制更新:forceUpdate(在组件中调用)
(1)介绍
强制让组件重新渲染。
调用 forceUpdate() 将使组件调用render() 方法,并忽略shouldComponentUpdate()。但是,组件的子组件也会调用自己的render(),组件重新渲染时,依然会读取this.props和this.state,如果状态没有改变,那么React只会更新DOM。
适用于this.props和this.state之外的组件重绘。所以应尽量避免使用forceUpdate()。
例:
export default class ForceUpdate extends React.Component{ constructor(){ super(); }; forceUpdateHandler(){ this.forceUpdate(); }; render(){ return( <div> <button onClick= {this.forceUpdateHandler.bind(this)} >FORCE UPDATE</button>
<h4>Random Number : { Math.random() }</h4>
</div>
);
}
}
调用此函数后,会调用的钩子函数顺序:
(2)格式
component.forceUpdate(callback)
参数说明:
callback:可选参数,回调函数,该函数会在组件render()方法调用后调用。
3、替换状态:replaceState
(1)介绍
replaceState()方法与setState()类似,但是方法只会保留nextState中状态,原state不在nextState中的状态都会被删除。
(2)格式
replaceState(object nextState[, function callback])
参数说明:
nextState,将要设置的新状态,该状态会替换当前的state。
callback,可选参数,回调函数。该函数会在replaceState设置成功,且组件重新渲染后调用。
备注:报错了,问题尚未解决
4、设置属性:setProps
(1)介绍
设置组件属性,并重新渲染组件
(2)格式
setProps(object nextProps[, function callback])
参数说明:
nextProps,将要设置的新属性,该状态会和当前的props合并
callback,可选参数,回调函数。该函数会在setProps设置成功,且组件重新渲染后调用。
备注:报错了,问题尚未解决
5、替换属性:replaceProps
(1)介绍
replaceState与setProps类似,但它会删除原有 props。
(2)格式
replaceProps(object nextProps[, function callback])
参数说明:
nextProps,将要设置的新属性,该属性会替换当前的props。
callback,可选参数,回调函数。该函数会在replaceProps设置成功,且组件重新渲染后调用。
备注:报错了,问题尚未解决
6、获取DOM节点:findDOMNode
(1)介绍
获取DOM节点。
如果组件已经挂载到DOM中,该方法返回对应的本地浏览器 DOM 元素。当render返回null 或 false时,this.findDOMNode()也会返回null。从DOM 中读取值的时候,该方法很有用,如:获取表单字段的值和做一些 DOM 操作。
大多数情况下,你可以绑定一个 ref 到 DOM 节点上,可以完全避免使用 findDOMNode。
从 React 16 开始,组件可能会返回有多个子节点的 fragment,在这种情况下,findDOMNode
会返回第一个非空子节点对应的 DOM 节点。
(2)格式
ReactDOM.findDOMNode(component)
返回值:DOM元素DOMElement
(3)注意
1)findDOMNode
是一个访问底层 DOM 节点的应急方案(escape hatch)。在大多数情况下,不推荐使用该方法,因为它会破坏组件的抽象结构。
3)findDOMNode
只在已挂载的组件上可用(即,已经放置在 DOM 中的组件)。
4)findDOMNode
不能用于函数组件。
例:
import React from ‘react‘; // import { findDOMNode } from ‘react-dom‘; import ReactDOM from ‘react-dom‘ import IndexCom from "./com/com" import "./index.scss" export default class Index extends React.Component { constructor(props) { super(props); this.state = { increment: 123 } } clickEvent() { // let node = findDOMNode(this.refs.IndexComNode) let node = ReactDOM.findDOMNode(this.refs.IndexComNode) console.log(node) } render() { return( <div className="index_page"> <button onClick={this.clickEvent.bind(this)}>单击就是了</button> <IndexCom ref="IndexComNode" increment={this.state.increment}></IndexCom> </div> ) } }
结果截图:
7、判断组件挂载状态:isMounted
(1)介绍
isMounted()方法用于判断组件是否已挂载到DOM中。可以使用该方法保证了setState()和forceUpdate()在异步场景下的调用不会出错。
(2)格式
bool isMounted()
返回值:true或false,表示组件是否已挂载到DOM中