当前位置: 首页 > 面试题库 >

将引用传递给道具的正确方法是什么?

蔚和安
2023-03-14
问题内容

我试图将一个组件的引用传递给另一个组件。由于不推荐使用字符串引用,因此我使用了回调引用。

所以我有类似的东西:

<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节点,但当用作道具时返回未定义。 如何让函数运行,这样我就可以用返回的值过滤结果? 谢谢