【问题标题】:REDUX: Why won't the store provide data to my component?REDUX:为什么商店不向我的组件提供数据?
【发布时间】:2017-05-07 02:38:00
【问题描述】:

新手在这里尝试学习一些 Redux。 目标:获得一个按钮来点击和登录/注销,无论哪种方式都将商店更新为真/假状态。

const store = createStore(myReducer) 创建了我的商店,传入了我的减速器。

这具有注销的默认状态。并在单击按钮时返回相反的结果。

我知道此操作通过调试起作用。

function myReducer(state = { isLoggedIn: false }, action) {
  switch (action.type) {
    case 'TOGGLE':
    return {
      isLoggedIn: !state.isLoggedIn
    }
    default:
    return state
  }
}

问题从这里开始——当我尝试访问 store.getState() 数据时。

class Main extends React.Component {
  render() {
    return (
      <div>
        <h1>Login Status: { state.isLoggedIn }</h1>
        <button onClick={this.props.login}>Login</button>
      </div>
    )
  }
}

const render = () => {
  ReactDOM.render(<Main status={store.getState().isLoggedIn} login={() => store.dispatch({ type: 'TOGGLE' })}/>,     document.getElementById('root'));
}

store.subscribe(render);
render();

我尝试了 store.getState().isLoggedIn & store.getState() & this.props.status,然后在 Main 组件中分配 store.getState().isLoggedIn - 但没有任何效果。

谁能告诉我哪里出错了?

【问题讨论】:

    标签: redux react-redux


    【解决方案1】:

    您不能使用getState 直接访问商店来查找数据。 Redux docs 深入解释了这个过程,但基本上你将使用 react-redux 包的 connect 方法将每个组件连接到 Redux 存储区。

    这是一个如何为您的上述组件工作的示例:

    import React, { Component } from 'react'
    import { connect } from 'react-redux'
    import Main from '../components/Main'
    
    class MainContainer extends Component {
      render() {
        return <Main {...this.props} />
      }
    }
    
    const mapStateToProps = state => ({
      isLoggedIn: state.isLoggedIn,
    })
    
    const mapDispatchToProps = dispatch => ({
      login() {
        dispatch({type: 'TOGGLE'})
      },
    })
    
    MainContainer = connect(
      mapStateToProps,
      mapDispatchToProps,
    )(MainContainer)
    
    export default MainContainer
    

    然后,您需要渲染 MainContainer 来代替 Main 组件。容器在渲染时会将isLoggedInlogin 作为道具传递给Main

    【讨论】:

    • 谢谢@MarkChandler - 我正在关注 Dan Abramov 教程,他的待办事项(以及因此切换待办事项)列表似乎还没有使用 mapStateToProps,在那个切换阶段?也许我走得太远了-但是如果您只想在 div 中显示登录“真”或“假”,那么 connect() 和上述内容是否必要?
    • @NewbieAid:您可以通过其他方式访问状态,例如从创建的文件中导入商店并调用store.getState(),但这是惯用的做事方式。不过,我会说您已经超越了自己,因为我知道他稍后会进入mapStateToProps。 Dan 在 egghead.io 上还有两个关于 Redux 的免费视频演练,涉及一些非常高级的主题。如果您从视频中学得很好,我绝对推荐它们!
    • 是的,我现在是 Egghead 的,谢谢。它只是在做我的疯子,因为有一个切换按钮来登录或注销(真/假)然后显示的想法似乎如此简单。 &我可以让它在控制台中显示......所以是的,我已经把头撞在屏幕上 5 个小时了!哈哈。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-10
    • 2019-03-03
    • 1970-01-01
    • 2017-10-12
    • 1970-01-01
    • 1970-01-01
    • 2014-07-14
    相关资源
    最近更新 更多