Redux不会设置initialState。动作派遣也失败

时间:2018-08-13 01:52:34

标签: javascript reactjs redux

我确实将initialState设置为reducer,如下所示,但是当我加载页面时,Detail按钮没有被禁用,并且当我单击Disable按钮时,也没有将其启用。调用该操作时,reducer中的console.log(“ 1”)正确显示。

var initialState2 = {
        disabled:true
        }

动作创建者

function clickDisable() {
  return {
      type: 'CLICK_DISABLE'
  }
}

此处的减速器

function reducreForButtonGroup2(state = initialState2, action) {
  if (typeof state === 'undefined') {
    return 0
  }
  var disabled;
  switch(action.type) {
      case 'CLICK_DISABLE': {
          console.log("1");
          if(state.disabled==true){
              return {
                  disabled: false
                  }
          }else{
              return {
                  disabled: true
                  }
          }
      }
      default :{
          return state
      }
  }
}

组件

 var DetailButton = React.createClass({ 
                clickDisable(event) {  
                    this.props.dispatch(clickDisable());  
                }  ,

              render() {

                const { disabled } = this.props;   

                return (
                <ButtonToolbar style={{width: 17+ 'em'}}>
                <Button  disabled={disable} style={{width: 5 + 'em'}}>Detail</Button>
                <Button onClick={this.clickDisable} style={{width: 5 + 'em'}}>Disable</Button>
                </ButtonToolbar>)
              }
            }) ;


function select(state) {  
    return {  
        disabled: state.disabled
    }  
}  

const NewDetailButton = connect(select)(DetailButton);

rootReducer

var rootReducer = Redux.combineReducers({
        reducreForButtonGroup,reducreForButtonGroup2
    });


ReactDOM.render(
 <Provider store={store}>
  <NewDetailButton/>
  </Provider>,
  document.getElementById('divDetailBtn')
);

新的减速器


我要添加的新减速器

var initialState = {
        value:15
        }

动作创建者

function clickAdd() {
  return {
      type: 'CLICK_ADD'
  }
}

新减少量

 function reducreForButtonGroup(state = initialState, action) {
      if (typeof state === 'undefined') {
        return 0
      }
      var value;
      switch(action.type) {
          case 'CLICK_ADD': {
              console.log("2");

              return {
                  value: state.value + 1
                  }

          }
          default :{
              return state
          }
      }
    }

组件

var ButtonGroup = React.createClass({

     clickAdd(event) {  
            this.props.dispatch(clickAdd());  
        }  ,

  render() {

      const { value } = this.props;     

        return (
          <ButtonToolbar style={{width: 17+ 'em'}} >
          <Button  id="search"   style={{width: 5 + 'em'}}>{value}</Button>
          <Button  onClick={this.clickAdd} style={{width: 5 + 'em'}}>Create</Button>
          </ButtonToolbar> 
        );
      }
});

将状态映射为道具

function select(state) {  
    return {  
        value: state.reducreForButtonGroup.value
    }  
}  

const NewButtonGroup = connect(select)(ButtonGroup);

1 个答案:

答案 0 :(得分:1)

disabled本身并不存在于道具中。它存在于props.reducreForButtonGroup2

因此更改以下内容

function select(state) {  
    return {  
        disabled: state.disabled
    }  
}

function select(state) {  
    return {  
        disabled: state.reducreForButtonGroup2.disabled
    }  
}

当前,它只是未定义的。因此,无论如何它都不会被禁用。

查找存储中数据的正确方法是通过化简器名称进行查找。由于您使用名称reducreForButtonGroup2声明了reducer,所以从reducer返回的任何内容(即{ disabled: true }{ disabled: false })都将在state.reducreForButtonGroup2的{​​{1}}中可用。因此,要检查按钮状态,您需要从mapStateToProps获取商店的状态。

这样,您现在可以通过返回该值来传递它作为道具。如果您在mapStateToProps中返回stats.reducreForButtonGroup2.disabled(在这种情况下为选择),则您的组件将收到{ disabled: state.reducreForButtonGroup2.disabled },其值为。

仅查看其工作原理,请从mapStateToProps返回一个不同的对象。例如:

this.props.disabled

组件中的道具现在将变为

function select(state) {  
    return {  
        isButtonDisabled: state.reducreForButtonGroup2.disabled
    }  
}