【问题标题】:React Redux: Getting Props And Updating StateReact Redux:获取道具和更新状态
【发布时间】:2018-04-17 08:01:36
【问题描述】:

我是第一次尝试 React/Redux/JS。我对在组件中设置状态与让 redux 更新它有点困惑。

我想单击一个按钮将 lightOn 设置为 true 并显示更新后的 this.props.lightOn 值。我缺少一些基本的东西,但不确定是什么。

行动:

export const setLight = lightStatus => dispatch => {
  const res = lightStatus;
  console.log(res); // => true on click

  dispatch({ type: SET_LIGHT, payload: res });
};

在组件中,{this.props.onLight} 未定义,所以我没有正确更新状态:

import React, { Component } from 'react';
import { connect } from 'react-redux';
//import * as actions from '../actions';
import { setLight } from '../actions';
import { bindActionCreators } from 'redux';

class Light extends Component {
  render() {

    return (
      <div>
        Light Status: {this.props.lightOn}
        <button
          className="btn"
          onClick={() => this.props.setLight(true)}
        >
          Set Light!
        </button>
      </div>
    );
  }
}

function mapStateToProps(state) {
  return {
    lightOn: state.lightOn
  };
}

function mapDispatchToProps(dispatch) {
  //whenever selectBook is called the result should be passed to all of our reducers
  return bindActionCreators({ setLight: setLight }, dispatch);
}

export default connect(mapStateToProps, mapDispatchToProps)(Light);

reducer(使用扩展运算符更新):

import { SET_LIGHT } from '../actions/types';

export default function(state = [], action) {
  switch (action.type) {
    case SET_LIGHT:
     return { ...state, lightOn: action.payload };
    default:
      return state;
  }
}

【问题讨论】:

    标签: javascript reactjs redux


    【解决方案1】:

    如何将其设置为状态而不是直接传递给函数?首先将其绑定在构造函数中,然后单击 setState 为 true ?

    constructor(props) {
    super(props);
    this.state:{lightOn: false};
    this.OnClick = this.OnClick.bind(this);
    }
    
    onClick(event) {
    this.setState({lightOn: true});
    }
    
    onClick ={this.onClick()}
    

    当你使用 redux 时,你可以通过返回一个新的状态来做到这一点

       return {...state, action.payload };
    

    【讨论】:

    • 什么?他使用redux。他不是在寻找一种内部状态的方式来处理这个......
    【解决方案2】:

    它是如何工作的? 通过connect,您可以注入用于控制redux 状态的props 并将其绑定到组件。例如:

    class SomeComponent extends React.Component {
        componentWillMount() {
            this.props.sendSomething('someName');
        }
    
        render() {
            return (
                <div>{this.props.stateProp}</div>
            )
        }
    }
    
    const mapStateToProps = state = ({
        stateProp: state.someReduxState,
    });
    
    const mapDispatchToProps = dispatch => ({
        sendSomething: (name) => dispatch(someActionCreator(name)),
    });
    
    const ConnectedComponent = connect(
        mapStateToProps,
        mapDispatchToProps,
    )(SomeComponent);
    

    在给定的示例中,您将someReduxState 状态的一部分绑定到stateProp,该stateProp 被注入到组件中。您正在注入方法 (sendSomething),它将在 redux 中调度和操作。如果组件中继显示部分 redux 状态,则每次 redux 状态更改时都会更新,因为注入组件的 props 会发生变化。您可以在 Redux 官方文档here 中找到更多信息,或者您可以在 egghead here 上观看免费教程。

    【讨论】:

      【解决方案3】:

      这里没有返回新状态

      export default function(state = [], action) {
        switch (action.type) {
          case SET_LIGHT:
            return action.payload;
          default:
            return state;
        }
      }
      

      你直接返回 action.payload 就是 lightStatus

      这意味着您无法在mapStateToProps 中访问state.lightOn

      你应该做的

       case SET_LIGHT:
                    return {
                      ...state,
                      lightOn: action.payload,
                    };
      

      或者直接

      case SET_LIGHT:
                        return {
                          ...state,
                          action.payload,
                        };
      

      这样整个状态不会丢失,也不会直接改变状态。 为了简单起见,这里我使用object spread operator 而不是Object.assign。

      【讨论】:

      • 我在减速器中添加了扩展运算符,如下所示: return { ...state, lightOn: action.payload } 但我仍然没有在组件中获得 this.props.lightOn 的值
      【解决方案4】:

      reducer 的错误,reducer 应该返回带有 lightOn 键的 state 对象,但你返回的是 payload 值,这就是问题所在。 你的 reducer 应该像这样返回带有有效载荷值的 lightOn。

      import { SET_LIGHT } from '../actions/types';
      
      export default function(state = {}, action) {
        switch (action.type) {
          case SET_LIGHT:
            return {...state, action.payload}
          default:
            return state;
        }
      }
      

      【讨论】:

        【解决方案5】:

        我现在使用对象设置而不是使用数组设置状态。我想我将 lightOn 对象放在了灯光阵列中,这使得它无法访问。

        行动:

        export const setLight = lightStatus => dispatch => {
          dispatch({ type: SET_LIGHT, payload: lightStatus });
        };
        

        减速器:

        import { SET_LIGHT } from '../actions/types';
        
        export default function(state = { on: false }, action) {
          console.log('state ', state);
          switch (action.type) {
            case SET_LIGHT:
              return { ...state, on: action.payload };
            default:
              return state;
          }
        }
        

        组件:

        import React, { Component } from 'react';
        import { connect } from 'react-redux';
        //import * as actions from '../actions';
        import { setLight } from '../actions';
        import { bindActionCreators } from 'redux';
        
        class Light extends Component {
          render() {
            return (
              <div>
                Light On: {this.props.light.on.toString()}
                <button
                  className="btn"
                  onClick={() => this.props.setLight(!this.props.light.on)}
                >
                  Set Light!
                </button>
              </div>
            );
          }
        }
        
        function mapStateToProps(state) {
          return { light: state.light };
        }
        
        function mapDispatchToProps(dispatch) {
          return bindActionCreators({ setLight: setLight }, dispatch);
        }
        
        export default connect(mapStateToProps, mapDispatchToProps)(Light);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-01-16
          • 1970-01-01
          • 2019-12-11
          • 1970-01-01
          • 2021-02-26
          • 2019-05-30
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多