反应-传递引用作为道具

Rya*_*yan 4 reactjs

我正在尝试管理带有反应的复选框。以下代码运行良好,但是我想重构render方法中的代码,以便它使用Component。我想将ref传递给该组件,但是我不知道该怎么做。

export default class AreRefsAwesomeCheckbox extends Component {
    constructor(props) {
        super(props);
        this.handleInputChange = this.handleInputChange.bind(this);
    }

    handleInputChange() {
        let data = {
            isFeatured: this.refs.check_me.checked
        };
        postJSON('/some/url', data);
    }


    componentDidMount() {
        const data = getJSON('/some/url');
        data.then(object => {
                this.refs.check_me.checked = object.will_i_have_a_nice_checkbox;
            }
        )
    }

    render() {
        return (
            <div>
                <label>
                    <input ref="check_me" type="checkbox" 
                           onChange={this.handleInputChange}/>
                    <div>Are refs good?</div>
                </label>

            </div>
        );
    }
}
Run Code Online (Sandbox Code Playgroud)

我在想像这样的事情

const Checkbox = ({myRef, changeInput, checkboxText}) => {
    return (
        <label>
            <input type="checkbox" ref={myRef} onChange={(event) => changeInput(event)}/>
            <div> {checkboxText} </div>
        </label>)
};
Run Code Online (Sandbox Code Playgroud)

然后将此代码段放入render方法中

<Checkbox myRef="check_me" changeInput={this.handleInputChange} checkboxText="Are refs good?"/>
Run Code Online (Sandbox Code Playgroud)

这显然行不通。我该怎么做呢?

And*_*anu 6

将回调引用传递到 中Component,如下所示:

<Checkbox myRef={ref => (this.checkbox = ref)} />
Run Code Online (Sandbox Code Playgroud)

哦,顺便说一句,请始终使用回调引用。在这里阅读更多内容

还有一个值得您考虑的想法:将fullchecked的值checkbox移至组件的状态AreRefsAwesomeCheckbox并使用完全受控的组件。这总是比ref具有更大的可预测性和更少的意外性要好。

完整代码:

const Checkbox = ({myRef, changeInput, checkboxText}) => {
  return (
    <label>
      <input
        type="checkbox"
        ref={myRef}
        onChange={event => changeInput(event)}
      />
      <div> {checkboxText} </div>
    </label>
  )
}

export default class AreRefsAwesomeCheckbox extends Component {
  constructor(props) {
    super(props)
    this.handleInputChange = this.handleInputChange.bind(this)
  }

  handleInputChange() {
    let data = {
      isFeatured: this.refs.check_me.checked,
    }

    postJSON('/some/url', data)
  }

  componentDidMount() {
    const data = getJSON('/some/url')
    data.then(object => {
      // this.checkbox is the reference to the checkbox element you need
      this.checkbox.checked = object.will_i_have_a_nice_checkbox
    })
  }

  render() {
    return (
      <div>
        <label>
          <Checkbox myRef={ref => (this.checkbox = ref)} />

          <div>Are refs good?</div>
        </label>
      </div>
    )
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,React 最近宣布了一个新的“createRef” API,它应该可以更干净地解决您的问题。在这里阅读更多信息:https://reactjs.org/blog/2018/03/29/react-v-16-3.html#createref-api (3认同)

Ili*_*asT 5

使用createRef可以创建最终传递给您的ref。

如果您要将ref传递给功能组件,请使用React.forwardRef

如果要将ref传递给类组件,请确保prop名称为除以外的任何名称,否则ref会收到特殊的prop警告。

  • 你让我今天一整天都感觉很好 !“确保道具名称是除 ref 之外的任何名称” (3认同)