我正在尝试管理带有反应的复选框。以下代码运行良好,但是我想重构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> ); } }
我在想像这样的事情
const Checkbox = ({myRef, changeInput, checkboxText}) => { return ( <label> <input type="checkbox" ref={myRef} onChange={(event) => changeInput(event)}/> <div> {checkboxText} </div> </label>) };
然后将此代码段放入render方法中
<Checkbox myRef="check_me" changeInput={this.handleInputChange} checkboxText="Are refs good?"/>
这显然行不通。我该怎么做呢?
将回调ref传递到中Component,如下所示:
Component
<Checkbox myRef={ref => (this.checkbox = ref)} />
哦,顺便说一句,请始终使用回调引用。在这里阅读更多。
还需要考虑的另一种想法:将完全checked值checkbox转换为AreRefsAwesomeCheckbox组件状态并使用完全受控的组件。这总是比ref具有更大的可预测性和更少的惊喜的更好。
checked
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> ) } }