最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 受控组件与非受控组件(二)

    正文概述 掘金(s叉叉)   2021-03-07   457

    讲非受控组件之前,我们先理解Refs and the DOM的概念。

    Refs and DOM

    在React的典型数据流中,props是父子组件的唯一交互方式。要修改子组件,就要通过修改props来重新渲染子组件。而refs属性,则提供了在典型数据流以外,强制修改子组件的方式。被修改的子组件可能是一个DOM元素,也有可能是一个组件React实例。

    使用refs属性

    通过React.createRef()函数创建一个ref,并通过ref属性附加到React元素上:

    class MyComponent extends React.Component {
    	constructor(){
    		super();
    		this.myRef = React.createRef();
      	this.handleClick = this.handleClick.bind(this);
    	}
      handleClick(){
        console.log(this.myRef.current)
      }
    	render(){
    		return <button ref={this.myRef} onClick={this.handleClick}>点击</button>
    	}
    }
    

    当 ref 被传递给 render 中的元素时,对该节点的引用可以在 ref 的 current 属性中被访问。

    const node = this.myRef.current
    

    如果ref属性属于一个HTML元素,则接收底层 DOM 元素作为current属性。

    如果ref属性属于一个class组件,ref 对象接收组件的挂载实例作为其 current 属性。

    React组件会在挂载的时候给current属性传入DOM元素,并在卸载的时候传入null值。ref 会在 componentDidMountcomponentDidUpdate 生命周期钩子触发前更新。

    refs转发

    不能在函数组件上使用ref,因为函数组件没有实例。但可以在函数式组件内部使用(使用useRef hook),只要它指向一个DOM或者class组件实例。要想在函数式组件中使用ref属性,可以使用forward ref:

    const FancyButton = React.forwardRef((prop, refProp) => {
      return <button ref={refProp}></button>
    })
    const refForward = React.createRef();
    <FancyButton ref={refForward}></FancyButton>
    

    这样通过ref可以访问到button元素,这个FancyButton接收了ref,并向下传递给子组件,就叫ref转发。

    refs回调

    通过ref回调可以在父组件在访问到子组件。通过给ref属性传入一个函数:

    function CustomTextInput(props) {
      return (
        <div>
          <input ref={props.inputRef} /></div>
      );
    }
    
    class Parent extends React.Component {
      render() {
        return (
          <CustomTextInput
            inputRef={el => this.inputElement = el} />
        );
      }
    }
    

    在这个例子中,我们在父组件中把回调函数以属性的方式传给子组件,子组件把ref属性设置为这个回调函数,这样,父组件的inputElement就指向子组件的input元素了。

    参考资料:

    React官方文档


    起源地下载网 » 受控组件与非受控组件(二)

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元