Redux 去改变store中的数据

一、创建store
index.js

import { createStore } from 'redux';
import reducer from './reducer';

const store = createStore(reducer);

export default store;

reducer.js

const defaultState = {
    inputValue: '123',
    list: [1,2]
}

export default (state = defaultState, action) => {
    return state;
}

TodoList.js

constructor(props) {
  this.state = store.getState();
}
render() {
 <div>
    <Input 
    value={this.state.inputValue} 
    placeholder="输入info" 
    style={{width: '300px', marginRight: '10px'}}
    onChange={this.handleInputChange}
    />
  <Button type="primary" onClick={this.handleButtonClick}>提交</Button>
  <List
    style={{marginTop:'10px', width:'300px'}}
    bordered 
    dataSource={this.state.list}
    renderItem={(item, index) => (<List.Item onClick={this.handleItemDelete.bind(this, index)}>{item}</List.Item>)}
    />
</div>
}

二、首先在组件中创建action, 将值传给store,再传给reducer;reducer进行数据的更改返回给store。store拿到reducer返回给它的数据后,自己进行一个更新。

handleInputChange(e) {
   const action = {
       type: 'input_change_vaule',
       value: e.target.value
   }
   store.dispatch(action);
}

handleButtonClick() {
   const action = {
       type: 'add_todo_item'
   }
   store.dispatch(action);
}

handleItemDelete(index) {
   const action = {
     type: 'delete_todo_item',
     index
   }
   store.dispatch(action);
}

reducer.js中对接收到的actiion的type来进行判断。

const defaultState = {
    inputValue: '123',
    list: [1,2]
}

//reducer 可以接受state, 但是绝不能修改state
export default (state = defaultState, action) => {
    if(action.type === 'input_change_value') {
        const newState = JSON.parse(JSON.stringify(state));
        newState.inputValue = action.value;
        return newState;
    }
    if(action.type === 'add_todo_item') {
        const newState = JSON.parse(JSON.stringify(state));
        newState.list.push(newState.inputValue);
        newState.inputValue = '';
        return newState;
    }
    if(action.type === 'delete_todo_item') {
        const newState = JSON.parse(JSON.stringify(state));
        newState.list.splice(action.index, 1);
        return newState;
    }
    return state;
}

三、store将更改后的数据传给Component。
在constructor中使用store中的subscribe方法监控数据改变时就触发。

constructor (props) {
   super(props);
   this.state = store.getState();
   this.handleInputChange = this.handleInputChange.bind(this); 
   this.handleStoreChange = this.handleStoreChange.bind(this);
   this.handleButtonClick = this.handleButtonClick.bind(this);
   store.subscribe(this.handleStoreChange);
}
handleStoreChange() {
  this.setState(store.getState());
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。