react/还原。从其他组件访问状态

IT技术 javascript reactjs redux
2021-05-22 05:05:44

我试图从另一个组件访问组件状态,但没有取得多大成功。到目前为止,我的代码如下所示:

这两个组件在入口文件 App.js 中呈现。第一个组件是移动导航。那个应该是打开/关闭的,这取决于组件 2 中的状态,它是一个切换按钮。谁能帮我吗?

组件 1.(在这里我想从组件 2 访问“切换”的状态)

import * as style from './MobileNavigation.style'
import React, { Component } from 'react'
import Button from '../../components/Button'

class MobileNavigation extends Component {
render() {
return (
  <style.Background>
    <style.Menu>
      <style.MenuItem>
        <style.RouterLink to="home">home</style.RouterLink>
      </style.MenuItem>
      <style.MenuItem>
        <style.RouterLink to="about">about</style.RouterLink>
      </style.MenuItem>
      <style.MenuItem>
        <style.RouterLink to="contact">contact</style.RouterLink>
      </style.MenuItem>
    </style.Menu>
  </style.Background>
)
  }
}

export default MobileNavigation

组件 2

import React, { Component } from 'react'
import styled from 'styled-components'
import * as style from './Hamburger.style'

interface Props {
  width: string
  height: string
  fill: string
  toggled?: boolean
}

interface State {
  toggled?: boolean
}

const Svg = styled.svg`
  width: ${(props: Props) => props.width};
  height: ${(props: Props) => props.height};
`

class Hamburger extends Component<Props, State> {
  static defaultProps = {
    width: '100%',
    height: '100%',
    fill: '#172b41',
    toggled: true
  }

  constructor(props: any) {
    super(props)
    this.state = {
      toggled: true
    }
  }

  onClick(toggled: boolean) {
    this.setState({
      toggled: !this.state.toggled,
    })
  }

  render() {
    return (
      <style.Wrapper onClick={this.onClick.bind(this, this.props.toggled)}>
    {this.state.toggled ? (
      <div>closed</div>
    ) : (
      <div>open</div>
    )}
  </style.Wrapper>
)
}
}

export default Hamburger
1个回答

react方式:

如果你想在自己的react中做到这一点(没有 redux),你需要shouldToggled在你的父组件 ( App.js) 中创建一个状态和一个函数来控制它那么您需要将函数传递给您的汉堡组件并将状态传递给另一个组件,在您的汉堡组件中,您需要使用函数来更改App.js组件中的状态,并且您的父状态将被更新并导致重新渲染. 这称为提升状态技术,您可以在 react 文档中查看更多信息。

还原方式:

redux 的方式有点复杂强硬。这样,您有两种选择,基于组件父/子关系的复杂性以及您的孩子的深度级别(在您的情况下只有一个级别深),与您需要在redux 存储上拥有状态的react方式相同要控制组件的切换状态,您也需要有一个动作创建者,以便触发该状态更改。然后在您的汉堡组件中,您需要调用该动作创建者将动作发送到减速器以更改存储,一旦存储以不可变的方式更改,整个 redux 存储将更新并立即提供给您的整个应用程序,并且finally 会导致您的组件重新渲染。

最后:

确保仅在复杂的情况下使用 redux 方式 b/c 你会发现它在那种情况下很有帮助,而不是在像你当前的问题这样的简单情况下。我对您的建议可能是:针对您当前的问题坚持使用react提升状态技术,b/c 在您的情况下它需要更少的样板代码。