【问题标题】:React: How to pass State value to another component and use it to render a componentReact:如何将 State 值传递给另一个组件并使用它来渲染组件
【发布时间】:2020-01-14 00:16:44
【问题描述】:

我希望每个人都做得很好。

所以我在 LandingPage 组件内部的 Toolbar 组件中有一个 Hamburger 组件。我在 Hamburger 组件中有一个状态钩子。我通过工具栏使用道具将状态值传递给 LandingPage 组件,并最终传递给 LandingPage 组件。 然后,我在 LandingPage 组件的部分内有一个三元运算符,以在它为 true 时显示一个新组件(称为 NavigationMenu),而在它为 false 时不显示它。 当我单击汉堡菜单时,我可以看到布尔值正在通过传递给 LandingPage 常量。 console.logging,但三元运算符似乎没有动态更新布尔值,也没有呈现导航页面。

https://codesandbox.io/s/gifted-cache-kqfz9

以上是汉堡吧的工作代码。您可以在控制台中看到传递给 LandingPage 的值正在更新,但三元运算符(位于 LandingPage.jsx 的底部)没有加载导航页面。

登陆页面jsx:

import React from 'react'

import Toolbar from './Toolbar'
import NavigationMenu from './NavigationMenu'

function LandingPage(props) {

const burgerStatus = []

return (
  <div className='landing-container' >
    <Toolbar burgerStatus={burgerStatus} />

    {burgerStatus[0] ? <NavigationMenu /> : null}
  </div>
)
}

export default LandingPage

工具栏.jsx:

import React from 'react'
import Hamburger from './Hamburger'


function Toolbar(props) {
return (
    <div className='navbar' >
      <Hamburger burgerStatus={props.burgerStatus} />
    </div>
)}

export default Toolbar

汉堡包.jsx:

import React, { useRef, useEffect, useState } from 'react'
import './Hamburger.scss'


function Hamburger(props) {

  const [burgerClick, setBurgerClick] = useState(true)

  props.burgerStatus[0] = burgerClick


  function clickBurger() {
    setBurgerClick(prev => {
      return (!burgerClick)
    })  

    if (burgerClick === true) {
       props.burgerStatus[0] = true
       console.log(props.burgerStatus[0])
    } else {
      props.burgerStatus[0] = false
       console.log(props.burgerStatus[0])
    }
  }



  return (
    <div className="hamburger" onClick={clickBurger} >
        <div className="line1"></div>
        <div className="line2"></div>
        <div className="line3">
          <div className="blankLeft"></div>
          <div className="line3-right"></div>
        </div>
    </div>

  )
}


export default Hamburger

我已经包含了上面的代码。 感谢您的宝贵时间。

【问题讨论】:

  • 可以在codesandbox上创建一个工作示例吗?
  • 您好,我已经更新了代码以简化代码,因此它只包括汉堡菜单和上面提到的相应文件。
  • 在此处包含代码以及指向代码框的链接。我们不希望更改代码框代码,一年后有人发现这个问题完美地代表了他们的问题,但没有任何代码。查看how to ask a good question 了解其他规则。
  • 您好,我已经在文中添加了代码。对不起,我对stackoverflow还很陌生。谢谢您的意见! :)

标签: javascript reactjs


【解决方案1】:

欢迎来到 SO。

关于您的问题。您似乎正在更新子组件内的道具。道具从父母传给孩子。

<LandingPage burgerStatus> => <Toolbar burgerStatus={burgerStatus} /> => <Hamburger burgerStatus={props.burgerStatus} />

在你正在做的汉堡组件中

  const [burgerClick, setBurgerClick] = useState(true)

  props.burgerStatus[0] = burgerClick

在响应中更新父项中的数据是使用回调函数完成的。 See this

Child to Parent - 使用回调和状态

  • 在我的父级中定义一个回调,它将我需要的数据作为参数。

  • 将该回调作为道具传递给孩子(见上文)。

  • 在子进程中使用 this.props.[callback] 调用回调(当然,在显示 [callback] 的地方插入您自己的名字),并将数据作为参数传入。

    李>

所以我有

  const [burgerClick, setBurgerClick] = useState(true)

在父级 (&lt;LandingPage&gt;) 中并将其作为 props 传递给 Hamburger。

&lt;Hamburger burgerStatus={props.burgerStatus} setBurgerStatus={props.setBurgerClick} /&gt;

在 Hamburger 中,您可以通过单击按钮获得 &lt;button onClick = {props.setBurgerClick(true)}/&gt;&lt;button onClick = {props.setBurgerClick(false)}/&gt;。由于这会更新父级中的道具,因此道具应该正确传递。

也看看这个。 Props are read only

【讨论】:

  • 你好。谢谢您的回答。这非常有效。但是,当我单击汉堡菜单时,如何防止 LandingPage.jsx 阻止完全重新渲染?我知道无论何时更改状态值,组件都会重新呈现。但是我听说过一些回调,例如 evt.preventDefault 能够防止重新渲染,我已经尝试过了,但它不起作用。
  • 我会使用shouldComponentUpdate(nextState) { if( this.state.burgerClick !== nextState.burgerClick){return false;} }; 这将防止在状态更改时重新渲染。我不会推荐这个,除非你在&lt;Landinpage /&gt; 中有很多逻辑,这将是一个沉重的负担。 React 在渲染元素方面非常有效,因此在状态更改时重新渲染应该不是问题。很好的例子 - lucybain.com/blog/2017/react-js-when-to-rerender
猜你喜欢
  • 1970-01-01
  • 2017-12-19
  • 2023-01-07
  • 1970-01-01
  • 2019-10-23
  • 2021-03-16
  • 2016-03-19
  • 1970-01-01
  • 2021-12-31
相关资源
最近更新 更多