redux

119 阅读3分钟

redux精简执行流程:

1,创建reducer,并给默认值

2, 根据已经创建的reducer创建store

3, this.state=store.getState();给组件store赋值,然后 value={this.state.inputValue}既可以将数据展示到页面

4,当页面数据状态进行改变的时候,需要创建action,store.dispatch(a ction);并将action 分发到store,store再转交给reducer处理

5,reducer进行处理之后,会返回新的state给storage,

 if(action.type="changeInput"){
        console.log(action.value);
        let newState=JSON.parse(JSON.stringify(state));
        newState.inputValue=action.value;
        return newState;
 }

6, store.subscribe(this.storeChange);组件对store状态进行订阅,每一次storage里的状态更改的时候,就会触发订阅函数,这里是组件内定义的storeChange。

需要注意的地方

1,只能有一个store

2, reducer不能改变state,只有store可以改变state

3,reducer必须是纯函数

纯函数:

​ 函数不依赖于外部任何变化,只依赖输入参数,返回结果是由传入值决定的。

import {createStore} from "redux"
import React from 'react'
import ReactDOM from 'react-dom'

//创建reducer
let defaultValue={
    inputValue:"这是输入默认数值",
    dataList:[1,2,3,6,7,8,11]
}
let reducer=(state=defaultValue,action)=>{
    if(action.type="changeInput"){
        console.log(action.value);
        let newState=JSON.parse(JSON.stringify(state));
        newState.inputValue=action.value;
        return newState;

    }
    return state;
}

//创建store仓库
let store =createStore(reducer);
//渲染页面
class App extends React.Component{
    constructor() {
        super();
        this.state=store.getState();

        this.storeChange=this.storeChange.bind(this);
        store.subscribe(this.storeChange);
        this.changeInput=this.changeInput.bind(this);
    }
    render(){
        return <div>
            <input type="text" value={this.state.inputValue} onChange={this.changeInput}/><button>提交</button>
            <ul>
                {this.state.dataList.map((item,index)=>{
                    return <li key={index}>这是第{item}个数据</li>
                })}
            </ul>
        </div>
    }
    storeChange(){
        console.log(this.setState);
        this.setState(store.getState());
}
changeInput(){
    let action={
        type:"changeInput",
        value:this.value
    }
    store.dispatch(action);
}
}
ReactDOM.render(<App></App>,document.getElementById("root"));

redux-thunk中间件

可以处理异步请求流程

react-redux

react-redux处理流程 1,store和reducer的创建和redux一致 2,Provider包含的子组件都可以使用store里面的state

return <Provider store={store}>
         <Todo/>
    </Provider>

3,用connect处理子组件状态与store进行交互 let Todo = connect(stateToProps, changeToProps)(TodoList) stateToProps:将组件的属性与state的props对应起来 changeToProps:将事件与组件属性对应起来

注意:当非受控组件变为受控组件的时候是不允许的

所以当value不存在时,用''进行填充

<input type="text" value={inputValue || ''} onChange={inputChange}/>
import {createStore} from "redux"
import React from 'react'
import ReactDOM from 'react-dom'
import {Provider, connect} from 'react-redux'

//创建reducer
let defaultValue = {
    inputValue: "这是输入默认数值",
    dataList: [1, 2, 3, 6, 7, 8, 11]
}
let reducer = (state = defaultValue, action) => {
    if (action.type = "inutChange") {
        let newState = JSON.parse(JSON.stringify(state));
        newState.inputValue = action.value;
        return newState;
    }
    return state;
}

//创建store仓库
let store = createStore(reducer);


let stateToProps = (state) => {
    return {
        inputValue: state.inputValue,
        dataList: state.dataList
    }
}

let changeToProps = (dispatch) => {
    return {
        inputChange: (e) => {
            let action = {
                type: "inutChange",
                value: e.target.value
            }
            dispatch(action);
        }
    }
}

//渲染页面
function TodoList(props) {
    let {inputValue, inputChange, dataList} = props;
    return <div>
        <input type="text" value={inputValue || ''} onChange={inputChange}/>
        <button>提交</button>
        <ul>
            {dataList.map((item, index) => {
                return <li key={index}>这是第{item}个数据</li>
            })}
        </ul>
    </div>
}

let Todo = connect(stateToProps, changeToProps)(TodoList)


function App() {
    return <Provider store={store}>
        <Todo/>
    </Provider>
}

ReactDOM.render(<App></App>, document.getElementById("root"));

react和redux的区别和联系:

共同点:创建store和reducers的方式是一样的
不同点:redux:
      通过store.subscribe(this.storeChange);订阅store,从而达到当store中的状态改变的时候,组件也会对应的改变.
      通过store.dispatch(action)来改变store中的状态。
      react-redux:
       通过stateToProps达到store中的state与props的同步。
       通过changeToProps来达到dispatch action,但是依然是使用了dispatch:
          inputChange: (e) => {
            let action = {
                type: "inutChange",
                value: e.target.value
            }
            dispatch(action);
        }
     react-redux中使用了Provider和connect组件,Provider是store的提供父组件,而connect包装的是使用store的子组件。

注意:

需要将connect封装后的子组件传递给父组件。

Provider和connect是react-redux提供的组件,但是createStore是redux的提供的方法。