【问题标题】:Accessing properties of a react component from the parent从父级访问反应组件的属性
【发布时间】:2021-01-22 17:02:25
【问题描述】:

我想将一些数据与一个组件捆绑在一起。下面是一个具有名为 name 的属性的 SFC 示例。我不想将属性name 与名为MyFormTab 的组件一起使用。相反,我想从父组件访问此属性并将其分配给在父组件中显示。

    const MyFormTab = (props) => {
        const name = props.name        


        return (
            <>
                <div className='flex-center-col'>
                    <input type='email'></input>
                    <input type='text'></input>
                </div>
            </>
        )
    
    }

然后我想在父组件中渲染这个组件并将 name 属性用于其他目的

    const ParentOfMyFormTab = () => {
        const [currentTab, setCurrentTab] = useState(1)
        const Tab1 = <MyFormTab name='Tab1' />
        const Tab2 = <MyFormTab name='Tab2' />
        return (
            <form>
                <div id="tabTitles">
                    <h2 onClick={setCurrentTab(1)}>Tab1.name</h2>
                    <h2 onClick={setCurrentTab(2)}>Tab2.name</h2>
                </div>
                {currentTab === 1 ? <Tab1 /> : <Tab2 />}
            </form>
        )
    }

除了 SFC,我还可以使用我正在考虑的类。

    class MyFormTab {
    
       constructor(name){
           this.name = name
       }
    
       render(){ 
           return (
                <>
                    <div className='flex-center-col'>
                        <input type='email'></input>
                        <input type='email'></input>
                    </div>
                </>
           )
    
       }
    }

然而,我的项目主要使用钩子。我的团队负责人(他不太了解 React)可能会犹豫将类组件与钩子混合。我在other posts 上读到过,在大多数情况下,钩子基本上可以替换类组件。我不知道钩子如何更好,甚至在这种情况下使用。


你认为什么是做我想做的事情的好方法?将带有钩子和类组件的 SFC 放在同一个项目中是个好主意吗?我是不是看错了整个事情?

谢谢

【问题讨论】:

  • 这听起来可能是XY problem。您能否详细说明您要使用 name 做什么?
  • name 不是您功能的道具。它只是一个局部变量。
  • @cbr 好的,我添加了更多解释
  • @jmargolisvt 那么你是说这是不可能的吗?同时使用 SFC 和类?
  • 当然可以,您可以在定义后将其设置为MyFormTab 的属性:MyFormTab.name = 'foobar'

标签: javascript reactjs react-hooks


【解决方案1】:

在反应中props 仅从父级传递给子级。因此,您可以只拥有一个具有该名称值的父级,并根据需要将其传递下去。 编辑了我的答案以回复您编辑。

const MyFormTab = (props) => {
    const name = props.name        

    return (
        <>
            <div className='flex-center-col'>
                <input type='email'></input>
                <input type='text'></input>
            </div>
        </>
    )
}

const ParentOfMyFormTab = () => {
    const [currentTab, setCurrentTab] = useState(1)
    const Tab1 = <MyFormTab name=`Tab1` />
    const Tab2 = <MyFormTab name=`Tab2` />
    return (
        <form>
            <div id="tabTitles">
                <h2 onClick={setCurrentTab(1)}>Tab1</h2>
                <h2 onClick={setCurrentTab(2)}>Tab2</h2>
            </div>
            {currentTab === 1 ? <Tab1 /> : <Tab2 />}
        </form>
    )
}

关于混合基于类和函数组件的问题。你不能对基于类的组件使用钩子,所以不要,也没有必要。我认为您应该更多地了解 React 的基础知识。如果您需要与其他组件共享数据,则数据应位于父组件中、传递给子组件或 React 上下文中。

【讨论】:

  • 我不会在类组件中使用钩子。有些组件会使用钩子,有些会是类组件
  • 为什么你认为你需要类组件?功能组件几乎可以完成您需要的一切。您可能需要稍后在项目中具有一些可重用的功能,并且这可以是您不能与类组件一起使用的自定义挂钩。如果您已经在使用钩子,则必须全力以赴使用功能组件,以防止未来的痛苦。
  • 类可以有属性,我想知道将数据从孩子传递给它的父母,我认为这是唯一的原因。我并不是说我需要使用它们,但我想知道这是否是一种有意义的方式。
  • 函数中可以有变量,就像上面的例子const name = 'Tab1'
  • 我更新了我的代码示例,试图更好地解释我想要做什么
猜你喜欢
  • 2019-01-16
  • 1970-01-01
  • 1970-01-01
  • 2021-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-17
  • 1970-01-01
相关资源
最近更新 更多