【问题标题】:How to access another components state without rendering that state?如何在不呈现该状态的情况下访问另一个组件状态?
【发布时间】:2018-01-13 23:54:25
【问题描述】:

用户登录后,我想在标题中显示名称。我一直在阅读有关如何传递道具的信息,但我看到的是,当您从另一个组件访问另一个组件状态时,您再次呈现其他组件的洞察力。如何在不渲染另一个组件的情况下访问另一个状态?在这里,我不想让 Header Component 洞察我的 Login 组件并想知道

  1. 这里我重定向,所以我可以传入状态(但由于我重定向到'/',它是主组件而不是标题组件,我仍然不知道如何在组件标题中访问它。
  2. 如果我不使用重定向,我如何将它传递给另一个?

           class Header extends React.Component {
              render () {   
                return (
                    <header>
                      <nav>
                        <p className="menuButton"><Link to='/'>Home</Link></p>
                        <p className="menuButton"><Link to='/login'>Login</Link></p>
                       </nav>
                    </header>
                 )
               }
            }
    

登录组件:

    class Login extends React.Component {
            constructor(props) {
                super(props)
                this.state = {
                    username:'',
                    email: '',
                    password: ''
                }
                this.loginFunc = this.loginFunc.bind(this)
            }
       loginFunc(){
          ... getting user data ...
          this.setState({
                username:response.firstname
          })
        ...
         history.push('/', { username: response.firstname });
         history.go('/');
       }
   }

【问题讨论】:

  • 不可能。为了让数据登录,您还必须在页面上呈现标题。除非你使用flux、redux之类的东西来拥有一个大的可共享状态。
  • 你应该使用像 redux、flux 这样的状态管理器。

标签: javascript reactjs setstate


【解决方案1】:

你可以有一个父 React 组件来跟踪状态 Header 和 Login 组件并通过 props 传递状态,您可以使用状态管理库,例如 FluxReduxMobX 或实现自己的 PubSub 机制。如果不使用 vanilla React 中的父组件,您根本无法访问其他组件的状态,因为 React 使用单向数据流。

我建议查看状态管理库,但如果您坚持使用选项一,您可以执行以下操作:

  1. 创建一个用于跟踪状态的父组件。该组件呈现 Header 和 Login 组件。将一个函数向下传递给 Login 组件(我们将其称为 updateState),以便 Login 组件可以在用户登录时调用它。
  2. 让 Login 组件通过调用从 Parent 组件传递下来的 updateState() 函数更新父组件中的状态 - 使用从 Login 操作接收到的数据。
  3. 使用来自父组件的新状态重新渲染 Header 组件,该状态已通过调用 updateState() 进行更改。

【讨论】:

  • 感谢您的回答。如果我有一个用于登录和标题的组件,我仍然可以将标题传递给我的 App 组件(即呈现主组件和标题组件的组件)。我不能只呈现标题并一起登录,而让应用程序的其余部分没有标题。
  • 您应该能够在您的 App 组件中导入/要求您的 Header 组件是的。但是按照我理解您的设置的方式,为什么不在您的 App 组件中从我的示例中创建 updateState 函数并将状态存储在那里?使用 props 将 updateState 函数传递给 Login 组件,并在用户登录时调用该函数。接下来,也使用 props 将状态从 App 组件传递到 Header 组件。
  • 如果我不渲染登录洞察应用程序组件,我可以这样做吗?我的应用程序呈现 Header 和 Main,Main 是我的
  • 看看this fiddle。这在您的浏览器中不起作用,但它应该让您了解我的意思。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-07
  • 2022-01-24
  • 2018-02-01
  • 2019-12-20
  • 1970-01-01
  • 1970-01-01
  • 2019-05-30
相关资源
最近更新 更多