我确实将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);
答案 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
}
}