我正在尝试管理带有反应的复选框。以下代码运行良好,但是我想重构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)
这显然行不通。我该怎么做呢?
将回调引用传递到 中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)
使用createRef可以创建最终传递给您的ref。
如果您要将ref传递给功能组件,请使用React.forwardRef。
如果要将ref传递给类组件,请确保prop名称为除以外的任何名称,否则ref会收到特殊的prop警告。
| 归档时间: |
|
| 查看次数: |
6067 次 |
| 最近记录: |