【问题标题】:ReactJS / Gatsby Js - Passing value of child component to parent component for button onClick linkReactJS / Gatsby Js - 将子组件的值传递给父组件以获取按钮 onClick 链接
【发布时间】:2021-01-22 23:10:26
【问题描述】:

我有一个简单的组件,它需要将链接值从子组件传回给父组件中的函数,但它只回调完整的函数而不是它的值。当我包含“navigate(/...)` 时,它可以工作,但会自动转到页面。我知道我错过了一些超级简单的东西,但它需要很长时间才能弄清楚。请参阅下面的代码。

//Parent Component
function ZodiacMDates({getDate}) {
  const zodiacSigns = [
    {
     id: 1,
     asign: 'Aries',
     link: 'aries',
     title: 'The Aries Mars Man',
     AriesSdate1: '158590800000', // '01/10/1975'
     AriesEdate1: '254494800000', // '01/24/1978'
     AriesSdate2: '350053200000', // '02/03/1981'
     AriesEdate2: '447253200000'  // '03/04/1984'
    },
    {
     id: 2,
     asign: 'Taurus',
     link: 'taurus',
     title: 'The Taurus Mars Man',
     TaurusSdate1: '-1244372400000', // '07/27/1930'
     TaurusEdate1: '-1186225200000', // '05/30/1932'
     TaurusSdate2: '496501200000',   // '09/25/1985'
     TaurusEdate2: '521298000000'   // '07/09/1986'
       }
    ]

const clickMan = (chosenZodiac) => {
    return (
     chosenZodiac
    )
  // return (
  // navigate(`/${chosenZodiac}`)
  // )
  }

const zodiacSignsMap = zodiacSigns.map(sign => <ZodiacMCheck 
                                                      key={sign.id} 
                                                      sign={sign} 
                                                      getDate = {getDate} 
                                                      findZodiac = {clickMan} />)
      return <div>
      {zodiacSignsMap}
    // This button Does not work
     <button onClick={()=>{navigate(`/${clickMan}`)}}>Find Me!</button>
      </div>


//Child Component
function ZodiacMCheck({getDate, sign, findZodiac}) {
   
    const zodiacLink = () => {
    return (
      findZodiac(sign.link)
        )
    }
    
    // Check For Aries
    if ((sign.AriesSdate1 <= getDate && sign.AriesEdate1 >= getDate) ||
        (sign.AriesSdate2 <= getDate && sign.AriesEdate2 >= getDate ) ||     
        //Check For Taurus
        (sign.TaurusSdate1 >= getDate && sign.TaurusEdate1 <= getDate) // Negative
        || (sign.TaurusSdate2 <= getDate && sign.TaurusEdate2 >= getDate )) {
           let zodiacSign = zodiacLink();
            return (
                <div>
               {zodiacsign}
                </div>
            )
        } 
                else {
            return (null)
        }
}

export default ZodiacMCheck

【问题讨论】:

标签: javascript reactjs gatsby


【解决方案1】:

将值放入状态并基于该状态生成&lt;Link&gt;

//Parent Component
function ZodiacMDates({getDate}) {
  const [link, setLink]=useState("");
  const zodiacSigns = [
    {
     id: 1,
     asign: 'Aries',
     link: 'aries',
     title: 'The Aries Mars Man',
     AriesSdate1: '158590800000', // '01/10/1975'
     AriesEdate1: '254494800000', // '01/24/1978'
     AriesSdate2: '350053200000', // '02/03/1981'
     AriesEdate2: '447253200000'  // '03/04/1984'
    },
    {
     id: 2,
     asign: 'Taurus',
     link: 'taurus',
     title: 'The Taurus Mars Man',
     TaurusSdate1: '-1244372400000', // '07/27/1930'
     TaurusEdate1: '-1186225200000', // '05/30/1932'
     TaurusSdate2: '496501200000',   // '09/25/1985'
     TaurusEdate2: '521298000000'   // '07/09/1986'
       }
    ]

const clickMan = (chosenZodiac) => {
   setLink(chosenZodiac)
  // return (
  // navigate(`/${chosenZodiac}`)
  // )
  }

const zodiacSignsMap = zodiacSigns.map(sign => <ZodiacMCheck 
                                                      key={sign.id} 
                                                      sign={sign} 
                                                      getDate = {getDate} 
                                                      findZodiac = {clickMan} />)
      return <div>
      {zodiacSignsMap}
     <Link to={link}>Find me!</Link>

我并没有改变你的逻辑,你有一个完全有效的函数findZodiac/clickManfindZodiac 作为道具传递,clickMan 在父组件中)接收值。因此,只需使用 useState 挂钩来保存该值并相应地设置一个有效的 &lt;Link&gt;

根据整个实现,您可能需要将功能保存在useEffect 中,以便在链接值更改时触发该功能,但思路是一样的。

【讨论】:

  • 非常感谢!我曾尝试在某个时候使用 useState,但我的花括号错误或结合使用了导航功能。感谢您的帮助!
  • 我很高兴它成功了。如果问题已解决,请考虑接受/投票以关闭问题
  • 实际上我告诉我必须将它包装在 UseEffect 中,因为我收到以下警告:反应警告:无法从不同组件的函数体内更新组件。
  • 当然,它总是取决于整个实现。如果没有完整的项目,就不可能猜测代码的行为方式。 useEffect 将在需要时触发更改,这是一个优雅的解决方案,但是,由于这个答案+修改代码,最终问题已经解决,这个想法一直是什么
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-04
  • 2021-08-20
  • 2019-01-04
  • 1970-01-01
  • 2017-04-28
  • 1970-01-01
相关资源
最近更新 更多