【发布时间】:2016-12-16 06:49:36
【问题描述】:
我正在尝试将一个组件的引用传递给另一个组件。由于string refs are being deprecated 我正在使用回调引用。
所以我有类似的东西:
<One ref={c => this.one = c}/>
<Two one={this.one}/>
问题是,每当我尝试在Two 中访问this.props.one 时,我都会得到undefined。
我什至在Two上试过这个:
componentDidMount(){
setTimeout(()=>{
console.log(this.props.one);
},5000)
}
似乎问题在于,在创建 prop 时,ref 还不存在,因为它是在安装 One 后创建的。但我不知道如何“刷新”Two 上的道具以获取已安装组件的引用。
那么将 ref 传递给另一个组件的正确方法是什么?
编辑
一些用户建议将该逻辑封装在更高的组件中,该组件本身会呈现其他子组件。
这种方法的问题是您无法创建可重用的逻辑,并且您必须在那些封装组件中一遍又一遍地重复相同的逻辑。
假设您想创建一个通用的<Form> 组件,它封装了向您的商店提交逻辑、错误检查等。您可以执行以下操作:
<Form>
<Input/>
<Input/>
<Input/>
<Input/>
<SubmitButton/>
</Form>
在此示例中,<Form> 无法访问子级的实例(和方法),因为this.props.children 不会返回这些实例。它返回一些伪组件列表。
那么如何在不传递 ref 的情况下检查某个 <Input/> 是否检测到验证错误?
您必须使用验证逻辑将这些组件封装在另一个组件中。例如<UserForm>。但是由于每个表单都不同,因此必须在<CategoryForm>、<GoupForm> 等中复制相同的逻辑。这非常低效,这就是为什么我想将验证逻辑封装在<Form> 中并传递<Input> 的引用组件到<Form>。
【问题讨论】:
-
我不确定您为什么要这样做,但最好还是考虑一下如何传递您想要的数据。 React 倾向于根据数据进行渲染,而不是根据渲染结果进行渲染,因此最好将数据放在更高的级别,以便可以将其传递给所有需要它的组件。
-
因为我需要传递组件的实例,这样我才能调用它的方法。使用回调引用不违反规则:facebook.github.io/react/docs/more-about-refs.html
-
啊,感谢您的澄清。对于那个特定的用例,我建议使用
context,它旨在解决这个问题。 facebook.github.io/react/docs/context.html -
我说得太早了,上下文并不能解决你的问题。上下文允许孩子从树的更高层引用类型化的“属性”,而无需专门传递这些属性。它可以帮助编写通用组件。执行此操作的“反应”方式是将表单状态移出 Input 组件。考虑有一个代表你的通用数据和验证逻辑的类——这个类封装了一个输入组件,但从父级传递下来。由于表单有这些实例的列表,它可以忽略子组件本身。
标签: javascript reactjs