我试图将一个组件的引用传递给另一个组件。由于不推荐使用字符串引用,因此我使用了回调引用。
所以我有类似的东西:
<One ref={c => this.one = c}/>
<Two one={this.one}/>
问题是,每当我尝试访问this.props.one
内部时,Two
我都会得到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
不返回这些实例,因此无法访问其实例(和方法)。它返回一些伪组件列表。
那么,如何在<Input/>
不通过引用的情况下检查某人是否检测到验证错误呢?
您必须使用验证逻辑将这些组件封装在另一个组件中。例如在中<UserForm>
。但是由于每种形式都不同,因此必须在<CategoryForm>
,<GoupForm>
等中复制相同的逻辑。这效率极低,这就是为什么我要封装验证逻辑<Form>
并将<Input>
组件的引用传递给的原因<Form>
。
通常,“ ref”功能是React中的反模式。它的存在是为了实现副作用驱动的开发,但是为了从React编程方式中获得最大收益,您应该尽可能避免使用“
refs”。
至于您的特定问题,让孩子参考同级是鸡与蛋的关系。加载子项时(而不是在渲染期间)会触发ref回调,这就是您的示例无法正常工作的原因。您可以尝试的一件事是将ref推入状态,然后从状态读入另一个子级。所以:
<One ref={c => !this.state.one && this.setState({ one: c })}/>
<Two one={this.state.one}/>
注意:没有,!this.state.one
将导致无限循环。
这是此工作的codepen示例(请在控制台上查看已记录的同级引用):http :
//codepen.io/anon/pen/pbqvRA
问题内容: 我试图找到定义可以以一般方式使用的组件的正确方法: 当然,可以想象并在父组件和子组件之间进行渲染的逻辑。 对于这个问题,这是一个虚拟的实现: 问题是,每当您用于定义包装器组件时,如何将某些属性传递给其所有子组件? 问题答案: 用新道具克隆Children 您可以使用React.Children遍历子级,然后使用React.cloneElement使用新的道具(浅合并)克隆每个元素,例如
我是一个相当新的反应,这是一个我正在努力解决的问题。
问题内容: 假设我有一个React类P,它渲染了两个子类C1和C2。 C1包含一个输入字段。我将此输入字段称为Foo。 我的目标是让C2对Foo的变化做出反应。 我已经提出了两种解决方案,但是它们都不对。 第一个解决方案: 为P分配一个状态,。 在P中创建一个函数,该函数接受一个事件并设置。 将其作为传递给C1 ,然后让C1绑定到Foo。 这可行。每当Foo的值改变时,它都会触发P中的a,因此P会
null null 就像在我的示例中一样,如果我有一个C1的大型呈现,我真的不想仅仅因为C1有一个form元素就把C1的整个放到P的中。 我该怎么做?
问题内容: 我正在尝试找到定义可以以一般方式使用的某些组件的正确方法: 当然,您可以想象并作为该逻辑的示例,在父组件和子组件之间存在一种渲染逻辑。 对于这个问题,这是一个虚拟的实现: 问题是,每当您用于定义包装器组件时,如何将某些属性传递给其所有子组件? 问题答案: Cloning children with new props 您可以使用React.Children遍历子级,然后使用React.
我试图使用在child中的函数中生成的值。js并将其传递给父级。所以我可以使用这个值来过滤子数组。 小孩js 是生成的值,我需要在父级中访问该值。js Parent.js 我是不是错过了一些显而易见的东西?控制台。日志for返回子项的所有值。js节点,但当用作道具时返回未定义。 如何让函数运行,这样我就可以用返回的值过滤结果? 谢谢