目录:
redux是什么?
什么情况下需要使用redux?
redux工作流程:
redux的三个核心概念
action
reducer
store
Count.jsx
import React, {Component} from 'react';class Count extends Component {state = {count: 0}increment = () => {const {value} = this.selectNumberconst {count} = this.statethis.setState({count: count + value * 1})}decrement = () => {const {value} = this.selectNumberconst {count} = this.statethis.setState({count: count - value * 1})}incrementIfOdd = () => {const {value} = this.selectNumberconst {count} = this.stateif (count % 2 !== 0) {this.setState({count: count + value * 1})}}incrementAsync = () => {const {value} = this.selectNumberconst {count} = this.statesetTimeout(() => {this.setState({count: count + value * 1})}, 500)}render() {return (<div><h1>当前求和为:{unt}</h1><select ref={c => this.selectNumber = c}><option value="1">1</option><option value="2">2</option><option value="3">3</option></select> <button onClick={this.increment}>+</button> <button onClick={this.decrement}>-</button> <button onClick={this.incrementIfOdd}>当前求和为奇数加</button> <button onClick={this.incrementAsync}>异步加</button> </div>);}
}export default Count;
Count.jsx
import React, {Component} from 'react';
import store from '../../redux/store'class Count extends Component {state = {carName: '奔驰c63'}// componentDidMount() {// store.subscribe(() => {// this.setState({})// })// }increment = () => {const {value} = this.selectNumberstore.dispatch({type: 'increment', data: value * 1})}decrement = () => {const {value} = this.selectNumberstore.dispatch({type: 'decrement', data: value * 1})}incrementIfOdd = () => {const {value} = this.selectNumberconst count = State()if (count % 2 !== 0) {store.dispatch({type: 'increment', data: value * 1})}}incrementAsync = () => {const {value} = this.selectNumbersetTimeout(() => {store.dispatch({type: 'increment', data: value * 1})}, 500)}render() {return (<div><h1>车名字:{this.state.carName}</h1><h1>当前求和为:{State()}</h1><select ref={c => this.selectNumber = c}><option value="1">1</option><option value="2">2</option><option value="3">3</option></select> <button onClick={this.increment}>+</button> <button onClick={this.decrement}>-</button> <button onClick={this.incrementIfOdd}>当前求和为奇数加</button> <button onClick={this.incrementAsync}>异步加</button> </div>);}
}export default Count;
store.js
import {createStore} from 'redux'
import countReducer from './count_reducer'export default createStore(countReducer)
count_reducer.js
const initState = 0export default function countReducer(preState = initState, action) {const {type, data} = actionswitch (type) {case 'increment':return preState + datacase 'decrement':return preState - datadefault:return preState}
}
index.js
import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';
import store from "./redux/store";const root = ElementById('root'));der(<App/>);store.subscribe(() => {der(<App/>);
})
新增文件:
Count.jsx
import React, {Component} from 'react';
import store from '../../redux/store'
import {createIncrementAction, createDecrementAction} from '../../redux/count_action'class Count extends Component {state = {carName: '奔驰c63'}// componentDidMount() {// store.subscribe(() => {// this.setState({})// })// }increment = () => {const {value} = this.selectNumberstore.dispatch(createIncrementAction(value * 1))}decrement = () => {const {value} = this.selectNumberstore.dispatch(createDecrementAction(value * 1))}incrementIfOdd = () => {const {value} = this.selectNumberconst count = State()if (count % 2 !== 0) {store.dispatch(createIncrementAction(value * 1))}}incrementAsync = () => {const {value} = this.selectNumbersetTimeout(() => {store.dispatch(createIncrementAction(value * 1))}, 500)}render() {return (<div><h1>车名字:{this.state.carName}</h1><h1>当前求和为:{State()}</h1><select ref={c => this.selectNumber = c}><option value="1">1</option><option value="2">2</option><option value="3">3</option></select> <button onClick={this.increment}>+</button> <button onClick={this.decrement}>-</button> <button onClick={this.incrementIfOdd}>当前求和为奇数加</button> <button onClick={this.incrementAsync}>异步加</button> </div>);}
}export default Count;
constant.js
export const INCREMENT = 'incrment'
export const DECREMENT = 'decrement'
count_action.js
import {DECREMENT, INCREMENT} from "./constant";export const createIncrementAction = data => ({type: INCREMENT, data})
export const createDecrementAction = data => ({type: DECREMENT, data})
count_reducer.js
import {INCREMENT, DECREMENT} from "./constant";const initState = 0export default function countReducer(preState = initState, action) {const {type, data} = actionswitch (type) {case INCREMENT:return preState + datacase DECREMENT:return preState - datadefault:return preState}
}
store.js
import {createStore} from 'redux'
import countReducer from './count_reducer'export default createStore(countReducer)
index.js
import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';
import store from "./redux/store";const root = ElementById('root'));der(<App/>);store.subscribe(() => {der(<App/>);
})
Count.jsx
import React, {Component} from 'react';
import store from '../../redux/store'
import {createIncrementAction, createDecrementAction, createIncrementAsyncAction} from '../../redux/count_action'class Count extends Component {state = {carName: '奔驰c63'}// componentDidMount() {// store.subscribe(() => {// this.setState({})// })// }increment = () => {const {value} = this.selectNumberstore.dispatch(createIncrementAction(value * 1))}decrement = () => {const {value} = this.selectNumberstore.dispatch(createDecrementAction(value * 1))}incrementIfOdd = () => {const {value} = this.selectNumberconst count = State()if (count % 2 !== 0) {store.dispatch(createIncrementAction(value * 1))}}incrementAsync = () => {const {value} = this.selectNumber// setTimeout(() => {// store.dispatch(createIncrementAction(value * 1))store.dispatch(createIncrementAsyncAction(value * 1, 500))// }, 500)}render() {return (<div><h1>车名字:{this.state.carName}</h1><h1>当前求和为:{State()}</h1><select ref={c => this.selectNumber = c}><option value="1">1</option><option value="2">2</option><option value="3">3</option></select> <button onClick={this.increment}>+</button> <button onClick={this.decrement}>-</button> <button onClick={this.incrementIfOdd}>当前求和为奇数加</button> <button onClick={this.incrementAsync}>异步加</button> </div>);}
}export default Count;
count_action.js
import {DECREMENT, INCREMENT} from "./constant";//同步action,就是指action的值为object类型的一般对象
export const createIncrementAction = data => ({type: INCREMENT, data})
export const createDecrementAction = data => ({type: DECREMENT, data})//异步action,就是指action的值为函数
export const createIncrementAsyncAction = (data, time) => {return (dispatch) => {setTimeout(() => {dispatch(createIncrementAction(data))}, time)}
}
store.js
import {createStore, applyMiddleware} from 'redux'
import countReducer from './count_reducer'
import thunk from 'redux-thunk'export default createStore(countReducer, applyMiddleware(thunk))
components/Count/Count.jsx
import React, {Component} from 'react';class Count extends Component {state = {carName: '奔驰c63'}increment = () => {const {value} = this.selectNumberthis.props.add(value * 1)}decrement = () => {const {value} = this.selectNumberthis.props.sub(value * 1)}incrementIfOdd = () => {const {value} = this.selectNumberif (unt % 2 !== 0) {this.props.add(value * 1)}}incrementAsync = () => {const {value} = this.selectNumberthis.props.addAsync(value * 1, 500)}render() {return (<div><h1>车名字:{this.state.carName}</h1><h1>当前求和为:{unt}</h1><select ref={c => this.selectNumber = c}><option value="1">1</option><option value="2">2</option><option value="3">3</option></select> <button onClick={this.increment}>+</button> <button onClick={this.decrement}>-</button> <button onClick={this.incrementIfOdd}>当前求和为奇数加</button> <button onClick={this.incrementAsync}>异步加</button> </div>);}
}export default Count;
containers/Count/Count.jsx
import CountUI from '../../components/Count/Count'
import {connect} from 'react-redux'
import {createDecrementAction, createIncrementAction, createIncrementAsyncAction} from "../../redux/count_action";
import {number} from "prop-types";function mapStateToProps(state) {return {count: state}
}function mapDispatchToProps(dispatch) {return {add: (number) => {dispatch(createIncrementAction(number))},sub: (number) => {dispatch(createDecrementAction(number))},addAsync: (number, time) => {dispatch(createIncrementAsyncAction(number, time))}}
}export default connect(mapStateToProps, mapDispatchToProps)(CountUI)
constant.js
export const INCREMENT = 'incrment'
export const DECREMENT = 'decrement'
count_action.js
import {DECREMENT, INCREMENT} from "./constant";//同步action,就是指action的值为object类型的一般对象
export const createIncrementAction = data => ({type: INCREMENT, data})
export const createDecrementAction = data => ({type: DECREMENT, data})//异步action,就是指action的值为函数
export const createIncrementAsyncAction = (data, time) => {return (dispatch) => {setTimeout(() => {dispatch(createIncrementAction(data))}, time)}
}
count_reducer.js
import {INCREMENT, DECREMENT} from "./constant";const initState = 0export default function countReducer(preState = initState, action) {const {type, data} = actionswitch (type) {case INCREMENT:return preState + datacase DECREMENT:return preState - datadefault:return preState}
}
store.js
import {createStore, applyMiddleware} from 'redux'
import countReducer from './count_reducer'
import thunk from 'redux-thunk'export default createStore(countReducer, applyMiddleware(thunk))
App.js
import React, {Component} from 'react';
import Count from "./containers/Count/Count";
import store from "./redux/store";class App extends Component {render() {return (<div><Count store={store}></Count></div>);}
}export default App;
index.js
import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';
import store from "./redux/store";const root = ElementById('root'));der(<App/>);store.subscribe(() => {der(<App/>);
})
containers/Count/Count.jsx
import CountUI from '../../components/Count/Count'
import {connect} from 'react-redux'
import {createDecrementAction, createIncrementAction, createIncrementAsyncAction} from "../../redux/count_action";export default connect(state => ({count: state}),// (dispatch) => (// {// add: number => dispatch(createIncrementAction(number)),// sub: number => dispatch(createDecrementAction(number)),// addAsync: (number, time) => dispatch(createIncrementAsyncAction(number, time))//// }){add: createIncrementAction,sub: createDecrementAction,addAsync: createIncrementAsyncAction}
)(CountUI)
App.js
import React, {Component} from 'react';
import Count from "./containers/Count/Count";class App extends Component {render() {return (<div><Count></Count></div>);}
}export default App;
index.js
import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';
import {Provider} from "react-redux";
import store from "./redux/store";const root = ElementById('root'));der(<Provider store={store}><App/></Provider>
);
containers/Count/Count.jsx
import React, {Component} from 'react';
import {connect} from 'react-redux'
import {createDecrementAction, createIncrementAction, createIncrementAsyncAction} from "../../redux/count_action";class Count extends Component {state = {carName: '奔驰c63'}increment = () => {const {value} = this.selectNumberthis.props.add(value * 1)}decrement = () => {const {value} = this.selectNumberthis.props.sub(value * 1)}incrementIfOdd = () => {const {value} = this.selectNumberif (unt % 2 !== 0) {this.props.add(value * 1)}}incrementAsync = () => {const {value} = this.selectNumberthis.props.addAsync(value * 1, 500)}render() {console.log(this.props)return (<div><h1>车名字:{this.state.carName}</h1><h1>当前求和为:{unt}</h1><select ref={c => this.selectNumber = c}><option value="1">1</option><option value="2">2</option><option value="3">3</option></select> <button onClick={this.increment}>+</button> <button onClick={this.decrement}>-</button> <button onClick={this.incrementIfOdd}>当前求和为奇数加</button> <button onClick={this.incrementAsync}>异步加</button> </div>);}
}export default connect(state => ({count: state}),{add: createIncrementAction,sub: createDecrementAction,addAsync: createIncrementAsyncAction}
)(Count)
index.js
import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';
import {Provider} from "react-redux";
import store from "./redux/store";const root = ElementById('root'));der(<Provider store={store}><App/></Provider>
);
App.js
import React, {Component} from 'react';
import Count from "./containers/Count/Count";
import Person from "./containers/Person/Person";class App extends Component {render() {return (<div><Count></Count><hr></hr><Person></Person></div>);}
}export default App;
store.js
import {createStore, applyMiddleware, combineReducers} from 'redux'
import countReducer from './reducers/count'
import thunk from 'redux-thunk'
import personReducer from "./reducers/person";const allReducer = combineReducers({he: countReducer,rens: personReducer
})export default createStore(allReducer, applyMiddleware(thunk))
constant.js
export const INCREMENT = 'incrment'
export const DECREMENT = 'decrement'
export const ADD_PERSON = 'add_person'
reducers/person.js
import {ADD_PERSON} from "../constant";const initState = [{id: '001', name: 'tom', age: 18}]export default function personReducer(preState = initState, action) {const {type, data} = actionswitch (type) {case ADD_PERSON:return [data, ...preState]default:return preState;}
}
reducers/count.js
import {INCREMENT, DECREMENT} from "../constant";const initState = 0export default function countReducer(preState = initState, action) {const {type, data} = actionswitch (type) {case INCREMENT:return preState + datacase DECREMENT:return preState - datadefault:return preState}
}
actions/person.js
import {ADD_PERSON} from '../constant'export const createAddPersonAction = personObj => ({type: ADD_PERSON, data: personObj})
actions/count.js
import {DECREMENT, INCREMENT} from "../constant";//同步action,就是指action的值为object类型的一般对象
export const createIncrementAction = data => ({type: INCREMENT, data})
export const createDecrementAction = data => ({type: DECREMENT, data})//异步action,就是指action的值为函数
export const createIncrementAsyncAction = (data, time) => {return (dispatch) => {setTimeout(() => {dispatch(createIncrementAction(data))}, time)}
}
Person.jsx
import React, {Component} from 'react';
import {nanoid} from "nanoid";
import {connect} from "react-redux";
import {createAddPersonAction} from "../../redux/actions/person";class Person extends Component {addPerson = () => {const name = this.nameNode.valueconst age = this.ageNode.valueconst personObj = {id: nanoid(), name, age}this.props.jiaYiRen(personObj)this.nameNode.value = ''this.ageNode.value = ''}render() {return (<div><h2>我是person组件,上方组件求和为{this.props.he}</h2><input ref={c => this.nameNode = c} type="text" placeholder="输入名字"/> <input ref={c => this.ageNode = c} type="text" placeholder="输入名字"/> <button onClick={this.addPerson}>添加</button> <ul>{this.props.yiduiren.map((p) => {return <li key={p.id}>{p.name}--{p.age}</li>})}</ul></div>);}
}export default connect(state => ({yiduiren: s, he: state.he}),{jiaYiRen: createAddPersonAction}
)(Person)
count.jsx
import React, {Component} from 'react';
import {connect} from 'react-redux'
import {createDecrementAction, createIncrementAction, createIncrementAsyncAction} from "../../redux/actions/count";class Count extends Component {increment = () => {const {value} = this.selectNumberthis.props.add(value * 1)}decrement = () => {const {value} = this.selectNumberthis.props.sub(value * 1)}incrementIfOdd = () => {const {value} = this.selectNumberif (unt % 2 !== 0) {this.props.add(value * 1)}}incrementAsync = () => {const {value} = this.selectNumberthis.props.addAsync(value * 1, 500)}render() {return (<div><h2>我是Count组件,下方组件总人数为:{shu}</h2><h2>当前求和为:{unt}</h2><select ref={c => this.selectNumber = c}><option value="1">1</option><option value="2">2</option><option value="3">3</option></select> <button onClick={this.increment}>+</button> <button onClick={this.decrement}>-</button> <button onClick={this.incrementIfOdd}>当前求和为奇数加</button> <button onClick={this.incrementAsync}>异步加</button> </div>);}
}export default connect(state => ({count: state.he, renshu: s.length}),{add: createIncrementAction,sub: createDecrementAction,addAsync: createIncrementAsyncAction}
)(Count)
项目结构:
运行结果:
index.js
import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';
import {Provider} from "react-redux";
import store from "./redux/store";const root = ElementById('root'));der(<Provider store={store}><App/></Provider>
);
App.js
import React, {Component} from 'react';
import Count from "./containers/Count/Count";
import Person from "./containers/Person/Person";class App extends Component {render() {return (<div><Count></Count><hr></hr><Person></Person></div>);}
}export default App;
store.js
import {createStore, applyMiddleware, combineReducers} from 'redux'
import thunk from 'redux-thunk'
import {composeWithDevTools} from "redux-devtools-extension";
import allReducer from "./reducers";export default createStore(allReducer, composeWithDevTools(applyMiddleware(thunk)))
constant.js
export const INCREMENT = 'incrment'
export const DECREMENT = 'decrement'
export const ADD_PERSON = 'add_person'
reducers/count.js
import {INCREMENT, DECREMENT} from "../constant";const initState = 0export default function countReducer(preState = initState, action) {const {type, data} = actionswitch (type) {case INCREMENT:return preState + datacase DECREMENT:return preState - datadefault:return preState}
}
reducers/index.js
import {combineReducers} from "redux";
import countReducer from "./count";
import personReducer from "./person";const allReducer = combineReducers({count: countReducer,persons: personReducer
})export default allReducer
reducers/person.js
import {ADD_PERSON} from "../constant";const initState = [{id: '001', name: 'tom', age: 18}]export default function personReducer(preState = initState, action) {const {type, data} = actionswitch (type) {case ADD_PERSON:return [data, ...preState]default:return preState;}
}
actions/count.js
import {DECREMENT, INCREMENT} from "../constant";//同步action,就是指action的值为object类型的一般对象
export const increment = data => ({type: INCREMENT, data})
export const decrement = data => ({type: DECREMENT, data})//异步action,就是指action的值为函数
export const incrementAsync = (data, time) => {return (dispatch) => {setTimeout(() => {dispatch(increment(data))}, time)}
}
actions/person.js
import {ADD_PERSON} from '../constant'export const addPerson = personObj => ({type: ADD_PERSON, data: personObj})
Person.jsx
import React, {Component} from 'react';
import {nanoid} from "nanoid";
import {connect} from "react-redux";
import {addPerson} from "../../redux/actions/person";class Person extends Component {addPerson = () => {const name = this.nameNode.valueconst age = this.ageNode.value * 1const personObj = {id: nanoid(), name, age}this.props.addPerson(personObj)this.nameNode.value = ''this.ageNode.value = ''}render() {return (<div><h2>我是person组件,上方组件求和为{unt}</h2><input ref={c => this.nameNode = c} type="text" placeholder="输入名字"/> <input ref={c => this.ageNode = c} type="text" placeholder="输入名字"/> <button onClick={this.addPerson}>添加</button> <ul>{this.props.persons.map((p) => {return <li key={p.id}>{p.name}--{p.age}</li>})}</ul></div>);}
}export default connect(state => ({persons: state.persons, count: unt}),{addPerson}
)(Person)
Count.jsx
import React, {Component} from 'react';
import {connect} from 'react-redux'
import {decrement,increment,incrementAsync
} from "../../redux/actions/count";class Count extends Component {increment = () => {const {value} = this.selectNumberthis.props.increment(value * 1)}decrement = () => {const {value} = this.selectNumberthis.props.decrement(value * 1)}incrementIfOdd = () => {const {value} = this.selectNumberif (unt % 2 !== 0) {this.props.increment(value * 1)}}incrementAsync = () => {const {value} = this.selectNumberthis.props.incrementAsync(value * 1, 500)}render() {return (<div><h2>我是Count组件,下方组件总人数为:{this.props.personCount}</h2><h2>当前求和为:{unt}</h2><select ref={c => this.selectNumber = c}><option value="1">1</option><option value="2">2</option><option value="3">3</option></select> <button onClick={this.increment}>+</button> <button onClick={this.decrement}>-</button> <button onClick={this.incrementIfOdd}>当前求和为奇数加</button> <button onClick={this.incrementAsync}>异步加</button> </div>);}
}export default connect(state => ({count: unt, personCount: state.persons.length}),{increment,decrement,incrementAsync}
)(Count)
1.下载依赖
2.build
3.启动服务器:
4.运行结果:
本文发布于:2024-01-30 12:45:49,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170658995320091.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |