1、文件目录

  1. src
  2. --store
  3. ---index.js
  4. ---reducer.js
  5. --views
  6. ---Home.js
  7. App.js
  8. index.js
  1. yarn add redux

2、根目录App.js , index.js

  1. //App.js
  2. import React, { Component } from 'react';
  3. import {
  4. BrowserRouter as Router,
  5. Switch,
  6. Route
  7. } from "react-router-dom";
  8. import Home from './views/Home'
  9. class App extends Component {
  10. render() {
  11. return (
  12. <div>
  13. <Router>
  14. <Switch>
  15. <Route exact path="/" >
  16. <Home/>
  17. </Route>
  18. </Switch>
  19. </Router>
  20. </div>
  21. );
  22. }
  23. }
  24. export default App;
  1. //index.js
  2. import React from 'react';
  3. import ReactDOM from 'react-dom';
  4. import App from './App';
  5. import "antd/dist/antd.css";
  6. ReactDOM.render(<App />, document.getElementById('root'));

3、store

  1. //index.js
  2. import {createStore} from 'redux';
  3. import reducer from './reducer';
  4. const store = createStore(
  5. reducer,
  6. window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__()
  7. );
  8. export default store;
  1. //reducer.js
  2. let defaultState = {
  3. msg:"react",
  4. list:[]
  5. }
  6. //reducer可以接收state,但是不能直接修改state
  7. export default (state=defaultState,action)=>{
  8. switch(action.type){
  9. case "change_input_value":
  10. let newState = {...state};
  11. newState.msg = action.value;
  12. return newState;
  13. case "add_todo_item":
  14. let nState = {...state};
  15. nState.list.push(nState.msg);
  16. nState.msg = ""
  17. return nState;
  18. case "delete_todo_item":
  19. let yState = {...state};
  20. yState.list.splice(action.value,1);
  21. return yState;
  22. default:
  23. return state;
  24. }
  25. }

4、views

  1. //Home.js
  2. import React, { Component } from 'react';
  3. import store from '../store'
  4. import { Input, Button, List } from 'antd'
  5. class Home extends Component {
  6. constructor(props) {
  7. super(props);
  8. this.state = store.getState();
  9. store.subscribe(this.handleStoreChange);
  10. }
  11. render() {
  12. return (
  13. <div>
  14. <Input
  15. style={{ width: 300, marginRight: "20px" }}
  16. value={this.state.msg}
  17. onChange={this.handleChange}
  18. placeholder="Basic usage" />
  19. <Button type="primary" onClick={this.handleAdd}>添加</Button>
  20. <div>
  21. <List
  22. size="small"
  23. bordered
  24. dataSource={this.state.list}
  25. renderItem={(item,index) => <List.Item
  26. actions={[<a key="list-loadmore-edit" onClick={this.handleDelete.bind(this,index)}>删除</a>]}
  27. >{item}</List.Item>}
  28. />
  29. </div>
  30. </div>
  31. );
  32. }
  33. handleChange = (e) => {
  34. let action = {
  35. type: "change_input_value",
  36. value: e.target.value
  37. }
  38. store.dispatch(action)
  39. }
  40. handleAdd = () => {
  41. let action = {
  42. type: "add_todo_item"
  43. }
  44. store.dispatch(action);
  45. }
  46. handleDelete=(index)=>{
  47. console.log(index)
  48. let action = {
  49. type:"delete_todo_item",
  50. value:index
  51. }
  52. store.dispatch(action);
  53. }
  54. handleStoreChange = () => {
  55. this.setState(store.getState())
  56. }
  57. }
  58. export default Home;