美文网首页
React 中的 Refs(9)

React 中的 Refs(9)

作者: 示十 | 来源:发表于2022-10-07 08:58 被阅读0次

Refs

允许我们访问真实 DOM

一般的,React 数据流是通过 props 来实现父子组件的交互

Refs 允许我们用于强制修改子组件

// 输入框焦点
class MyInput extends React.Component {
  constructor(props) {
    super(props);

    this.inputRef = React.createRef();
  }

  inputOperating() {
    console.log(this.inputRef.current.value);
    this.inputRef.current.focus();
  }

  render() {
    return (
      <div>
        <input type="text" ref={this.inputRef} />
        <button onClick={this.inputOperating.bind(this)}>获取焦点</button>
      </div>
    );
  }
}

// 媒体管理
class MyVideo extends React.Component {
  constructor() {
    super();
    this.vdoRefs = React.createRef();
  }

  vdoPause() {
    this.vdoRefs.current.pause();
  }
  vdoPlay() {
    this.vdoRefs.current.play();
  }

  render() {
    return (
      <div>
        <video
          ref={this.vdoRefs}
          src="http://vjs.zencdn.net/v/oceans.mp4"
          controls
          autoPlay
          muted
        ></video>
        <button onClick={this.vdoPause.bind(this)}>暂停</button>
        <button onClick={this.vdoPlay.bind(this)}>播放</button>
      </div>
    );
  }
}
// 操作动画
class MyBox extends React.Component {
  constructor(props) {
    super(props);
    this.boxRef = React.createRef();
  }
  boxExtend() {
    const oBox = this.boxRef.current;
    oBox.style.width = "500px";
    oBox.style.height = "500px";
  }
  render() {
    return (
      <>
        <div
          ref={this.boxRef}
          style={{
            width: 200 + "px",
            height: 200 + "px",
            backgroundColor: "orange",
            transition: "all 1s",
          }}
        ></div>
        <button onClick={this.boxExtend.bind(this)}>Extend</button>
      </>
    );
  }
}

createRef 用法细节

  • 通过 createRef 创建 ref 对象
  • 通过元素的 ref 属性可以附加到 React 元素上
  • 一般通过构造器中给 this 赋值一个 ref,方便整个组件使用
  • ref 只要传递 React 元素中,就可以利用 refcurrent 属性访问到该真实 DOM 节点
  • ref 在 componentDidMountcomponentDidUpdate 触发前更新

ref 不同的使用方式:

  • ref 放在 HTML 元素上,则指向真实 DOM 节点
  • ref 放在 class 组件上,则指向组件实例
    <MyBox ref={xxx}/>
  • ref 放在函数组件上,不能增加 ref 属性,可以使用 React.useRef()

forwardRef (v16.3 以上版本)

将子组件的 ref 暴露给父组件

React.forwardRef((props, ref) => { return React 元素})
const MyInput = React.forwardRef((props, ref) => (
  // ref 参数只能在,用 forwardRef 定义的组件内可接收
  <input type="text" placeholder={props.placeholder} ref={ref} />
));

class App extends React.Component {
  constructor(props) {
    super(props);
    this.myInputRef = React.createRef();
  }
  inputOperate() {
    this.myInputRef.current.value = "";
    this.myInputRef.current.focus();
  }
  render() {
    return (
      <div>
        <MyInput placeholder="请输入" ref={this.myInputRef} />
        <button onClick={this.inputOperate.bind(this)}>获取焦点</button>
        {/* <MyVideo /> */}
        {/* <MyBox ref={xxx}/> */}
      </div>
    );
  }
}
// 高阶组件 ref 转发
class MyInput extends React.Component {
  render() {
    return <input type="text" placeholder={this.props.placeholder} />;
  }
}

function InputHoc(WarpperComponent) {
  class Input extends React.Component {
    render() {
      const { forwardRef, ...props } = this.props;
      return <WarpperComponent ref={forwardRef} {...props} />;
    }
  }
  function forwardRef(props, ref) {
    return <Input forwardRef={ref} {...props} />;
  }

  // 设置别名
  forwardRef.displayName = `Input - ${WarpperComponent.name}`;
  return React.forwardRef(forwardRef);


  // return React.forwardRef((props, ref) => (
  //   <Input forwardRef={ref} {...props} />
  // ));
}

const MyInputHoc = InputHoc(MyInput);

class App extends React.Component {
  constructor(props) {
    super(props);

    this.myInputRef = React.createRef();
  }

  componentDidMount() {
    console.log(this.myInputRef);
  }

  inputOperate() {
    this.myInputRef.current.value = "";
    this.myInputRef.current.focus();
  }

  render() {
    return (
      <>
        <MyInputHoc ref={this.myInputRef} placeholder="请输入" />
        <button onClick={this.inputOperate.bind(this)}>获取焦点</button>
      </>
    );
  }
}

Refs 转发(v16.2 及以下)

  1. 通过 props 转发
class MyInput extends React.Component {
  render() {
    return <input type="text" ref={this.props.inputRef} />;
  }
}

// 通过 props 转发
class App extends React.Component {
  constructor(props) {
    super(props);
    this.inputRef = React.createRef();
  }
  componentDidMount() {
    console.log(this.inputRef);
  }

  render() {
    return (
      <div>
        <MyInput inputRef={this.inputRef} />
      </div>
    );
  }
}
  1. 回调 Refs
class App extends React.Component {
  constructor(props) {
    super(props);
    this.inputRef = null;
  }
  setMyInput(el) {
    this.inputRef = el;
  }
  focusInput() {
    this.inputRef.value = "";
    this.inputRef.focus();
  }
  render() {
    return (
      <div>
        <input type="text" ref={this.setMyInput.bind(this)} />
        <button onClick={this.focusInput.bind(this)}>click</button>
      </div>
    );
  }
}
  1. 字符串 refs(不建议使用)
  • 组件实例下面的 refs 集合里的 ref
  • 需要 React 保持跟踪当前正在渲染的组件,this 没法确定
  • React 获取 ref 可能会比较慢
  • 不能在 render 中工作
  • 不能组合,只能设置一个 ref
class App extends React.Component {
  componentDidMount() {
    // 字符串 refs
    console.log(this.refs.inputRef);
  }

  render() {
    console.log(this.refs.inputRef); // undefined
    return (
      <div>
        <input type='text' ref='inputRef' />
      </div>
    );
  }
}

相关文章

  • React 中的 Refs(9)

    Refs 允许我们访问真实 DOM 一般的,React 数据流是通过 props 来实现父子组件的交互 Refs ...

  • 关于react中refs的使用

    在react中,可以使用refs来访问dom,或者在render中创建react对象。 使用refs的主要用途是 ...

  • Refs

    Refs提供了一种访问DOM节点或在render方法中创建的React元素的方法。 refs是React组件中非常...

  • React入门教程(8)Refs & DOM高级

    Refs & DOM Refs 提供了一种方式,用于访问在 render 方法中创建的 DOM 节点或 React...

  • React中Refs的使用方法

    欢迎访问主页,有更多文章内容转载请注明原出处原文链接地址:React中Refs的使用方法 什么是Refs Refs...

  • refs是什么,如何使用,需要注意什么

    Refs是什么? Refs 提供了一种方式,允许我们访问 DOM 节点或在 render 方法中创建的 React...

  • React高级指引(2)

    Refs & DOM Refs提供了一种方式,用于访问在render方法中创建的DOM节点或React元素创建Re...

  • 获取Textarea中光标位置

    参数 element 是 react 中的 t.refs.xxx 获取到的节点对象。

  • 了解React中的refs

    refs这部分是在做公司一个小组件(视频弹框蒙层)时候遇到的,是react进阶部分内容,学习内容与心得整理如下,欢...

  • React中的Refs & DOM

    在React数据流中,父子组件唯一的交流方式是通过props属性;如果要修改子组件,通过修改父组件的属性,更新达到...

网友评论

      本文标题:React 中的 Refs(9)

      本文链接:https://www.haomeiwen.com/subject/dqunortx.html