23.组件改变Store中的数据~~~~ 创建Action和reducer。 - yiqunkeke/react-jianshu-shangguigu-zty GitHub Wiki
首先,组件中:
---- 创建并派发Action
在React中,action就是一个对象
import store from './store'
constructor(props) {
super(props)
this.state = store.getState()
}
render() {
return (
<input
value={this.state.inputValue}
onChange={(e) => this.handleInputChange(e)}
className="input"
id="insertArea"
/>
)
}
handleInputChange = (e) => {
// 1.创建 Action--告诉Store,要把Store中的inputValue改成 e.target.value
const action = { // 在React中,action是一个对象
type: 'change_input_value',
value: e.target.value
}
// 2.把Action传给Store
store.dispatch(action)
// 3.接着,Store会接收到这个action。它会把当前的state和接收到的这个action,一起转发给reducer。在reducer中处理。
// Redux中的Store会自动地转发当前的state和action给reducer。
// 4. 接着,只要去编写reducer
}
接着,reducer 中:
---- 接收并处理Action,改变Store数据
reducer的作用是--拿到上一次的state数据和当前要做的事情和数据。对上一次的state数据做处理。最后返回一个新的数据给Store
const defaultState = {
inputValue: '123',
list: ['学英语', '学react']
}
export default (state = defaultState, action) => {
console.log(state, action)
// state指的是Store中,上一次存储的数据。
// action指的是用户传递过来的那句话。
if(action.type==='change_input_value') {
// reducer的限制:可以接收state,但是绝对不能修改state!!
let newState = JSON.parse(JSON.stringify(state)); // 对拿到的上一次state做深拷贝。
// 5. reducer 去改变数据
newState.inputValue = action.value
// 6. 并返回一个 newState 给Store
return newState
// 7. 接着Store接收到newState后,会自动用newState自动替换掉老的state。
}
return state
}
通过Redux DevTools进行调试,可以看到:已经实现了在input中输入数据时,store中的数据也会发生变化 。
最后,组件中:
---在组件中订阅store
Store中的数据只要发生改变,subscribe中的回调函数就会自动执行
import store from './store'
constructor(props) {
super(props)
this.state = store.getState()
}
componentDidMount() {
store.subscribe(this.handleStoreChange) // 组件订阅store---Store中的数据只要发生改变,subscribe中的回调函数就会自动执行
}
handleStoreChange = () => {
console.log('store changed') // Store数据发生变化,让页面上的input的value也跟着变化
this.setState(store.getStore()) // 当感知到Store数据发生变化时,使用store.getState()从Store中重新取一次数据。
// 然后调用this.setState 替换掉当前组件中的数据。
}
这样就实现了组件派发action---Store接收并自动转发给reducer----reducer接收state和action,处理数据,返回newState给Store ---- Store 自动用newState替换掉老的state ----组件中订阅Store(当Store中数据发生变化,会自动执行subscribe中的回调函数,去替换掉当前的state)