react - 组件API

官网地址: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)。在大多数情况下,不推荐使用该方法,因为它会破坏组件的抽象结构。

2)严格模式下已弃用。

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()

返回值:truefalse,表示组件是否已挂载到DOM中

猜你喜欢

转载自www.cnblogs.com/AmberNi/p/11658560.html