1、安装并导入axios : import axios from ‘axios’;
    2、在 componentDidMount() 生命周期函数 发起 axios 请求
    // TodeList.js

    1. componentDidMount() {
    2. axios.get('/list.json').then((res) => {
    3. })
    4. //此处先不写 catch 后的内容
    5. }

    3、发起ajax 请求 用charles 模拟一个 接口
    image.png

    4、可console json文件中的 data 看是否通过
    // TodeList.js

    1. componentDidMount() {
    2. axios.get('/list.json').then((res) => {
    3. const data = res.data;
    4. console.log(data)
    5. })
    6. }

    image.png
    image.png

    5、改store 里的数据 要把内容链接redux 中的数据 渲染到页面
    (1)、创建action , 函数 initListAction 通过action 发送
    actionCreatore.js

    1. import { CHANG_INPUT_VALUE, ADD_TODO_ITEM, DELETE_ITEM, INIT_LIST_ACTION } from './actionTypes'
    2. export const initListAction = (data) => ({
    3. type: INIT_LIST_ACTION,
    4. data
    5. })
    1. actionTypes 常量定义<br />actionTypes.js
    1. export const INIT_LIST_ACTION = 'init_list_action';

    (2) 、组件中引入 创建好的 action
    // TodeList.js

    1. import {getInputChangeAction, getAddTodoItem, getDeleteItem, initListAction } from './store/actionCreator';

    使用 // TodeList.js

    1. componentDidMount() {
    2. axios.get('/list.json').then((res) => {
    3. const data = res.data;
    4. const action = initListAction(data);
    5. console.log(action)
    6. // 把action发送给store,传递到 store, store 拿到之前的数据和当前的 action 一起给到 reducer
    7. store.dispatch(action)
    8. })
    9. }
    1. 3reducer 做操作
    1. import {INIT_LIST_ACTION } from './actionTypes'
    1. const defaultState = {
    2. inputValue: '',
    3. list: []
    4. }
    5. export default (state = defaultState, action) => {
    6. if(action.type === INIT_LIST_ACTION ) {
    7. const newState = JSON.parse(JSON.stringify(state));
    8. newState.list = action.data
    9. return newState;
    10. }
    11. }

    (4)、通过监听store的变化渲染到页面,在 construtor 中 用 store.subscribe() 监听

    1. constructor(props) {
    2. store.subscribe(this.handleStoreChange);
    3. }

    这样 模拟的 json 数据就显示在页面上啦,效果如下:
    image.png

    完整代码:

    1. // store/index.js
    2. import { createStore } from 'redux';
    3. // 把创建好的 reducer 传递过来
    4. import reducer from './reducer'
    5. // 于是把笔记本当做第一个参数传递给这个store
    6. const store = createStore(
    7. reducer,
    8. window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__()
    9. );
    10. export default store;
    1. // src/TodeList.js
    2. import React,{Component} from 'react';
    3. // 1、引入 antd 的样式
    4. import 'antd/dist/antd.css';
    5. import store from './store';
    6. import TodoListUI from './store/TodoListUI';
    7. import {getInputChangeAction, getAddTodoItem, getDeleteItem, initListAction } from './store/actionCreator';
    8. import axios from 'axios';
    9. class TodoList extends Component {
    10. constructor(props) {
    11. super(props);
    12. this.state = store.getState();
    13. this.handleInputChange = this.handleInputChange.bind(this);
    14. this.handleStoreChange = this.handleStoreChange.bind(this);
    15. this.handleBtnChange = this.handleBtnChange.bind(this);
    16. this.handleDeleteItem = this.handleDeleteItem.bind(this);
    17. store.subscribe(this.handleStoreChange);
    18. }
    19. render() {
    20. return <TodoListUI
    21. value={this.state.inputValue}
    22. list={this.state.list}
    23. handleInputChange={this.handleInputChange}
    24. handleBtnChange={this.handleBtnChange}
    25. handleDeleteItem={this.handleDeleteItem}
    26. />
    27. }
    28. componentDidMount() {
    29. axios.get('/list.json').then((res) => {
    30. const data = res.data;
    31. const action = initListAction(data);
    32. console.log(action)
    33. // 发送给reduer 请求
    34. store.dispatch(action)
    35. })
    36. }
    37. handleInputChange(e) {
    38. // 怎么样去链接store 中的 inputValue 呢?1、创建一个action ,也就是创建一句话。
    39. const action = getInputChangeAction(e.target.value)
    40. store.dispatch(action);
    41. }
    42. handleStoreChange() {
    43. // 调用store.getState 方法从 store 中重新取数据。然后调用 setState 替换掉当前的数据。这样组件的数据就和store 的数据同步了
    44. this.setState(store.getState())
    45. }
    46. handleBtnChange() {
    47. const action = getAddTodoItem();
    48. store.dispatch(action);
    49. }
    50. handleDeleteItem(index) {
    51. const action = getDeleteItem(index)
    52. store.dispatch(action);
    53. }
    54. }
    55. export default TodoList;
    1. // store/TodeListUI.js
    2. import React,{Component} from 'react';
    3. import { Input,Button,List} from 'antd'
    4. const TodoListUI = (props) => {
    5. return (
    6. <div>
    7. <div style={{marginLeft: '10px',marginTop:'10px'}}>
    8. <Input
    9. placeholder="请输入框"
    10. style={{width:'300px', marginRight: '10px'}}
    11. value={props.inputValue}
    12. onChange={props.handleInputChange}
    13. ></Input>
    14. <Button
    15. type="primary"
    16. onClick={props.handleBtnChange}
    17. >提交</Button>
    18. </div>
    19. <List
    20. style={{marginTop: '10px', width:'300px'}}
    21. bordered
    22. dataSource={props.list}
    23. renderItem={(item,index) => (
    24. <List.Item onClick={(index) => {props.handleDeleteItem(index)}}>
    25. {item}
    26. </List.Item>
    27. )}
    28. />
    29. </div>
    30. )
    31. }
    32. export default TodoListUI;
    1. // store/actionCreator.js
    2. import { CHANG_INPUT_VALUE, ADD_TODO_ITEM, DELETE_ITEM, INIT_LIST_ACTION } from './actionTypes'
    3. export const getInputChangeAction = (value) => ({
    4. type: CHANG_INPUT_VALUE,
    5. value
    6. })
    7. export const getAddTodoItem = () => ({
    8. type: ADD_TODO_ITEM
    9. })
    10. export const getDeleteItem = (index) => ({
    11. type: DELETE_ITEM,
    12. index
    13. })
    14. export const initListAction = (data) => ({
    15. type: INIT_LIST_ACTION,
    16. data
    17. })
    1. // store/actionTypes.js
    2. export const CHANG_INPUT_VALUE = 'change_input_value';
    3. export const ADD_TODO_ITEM = 'add_todo_item';
    4. export const DELETE_ITEM = 'delete_item';
    5. export const INIT_LIST_ACTION = 'init_list_action';
    1. // store/reducer.js
    2. import store from "../store";
    3. import { CHANG_INPUT_VALUE, ADD_TODO_ITEM, DELETE_ITEM, INIT_LIST_ACTION } from './actionTypes'
    4. // 定义一个默认为空的数据
    5. const defaultState = {
    6. inputValue: '',
    7. list: []
    8. }
    9. export default (state = defaultState, action) => {
    10. if(action.type === CHANG_INPUT_VALUE ) {
    11. // 改变 inputValue 的值,做一个变量深拷贝去修改
    12. const newState = JSON.parse(JSON.stringify(state));
    13. // 改成新传递过来的值
    14. newState.inputValue = action.value
    15. return newState;
    16. }
    17. if(action.type === INIT_LIST_ACTION ) {
    18. const newState = JSON.parse(JSON.stringify(state));
    19. newState.list = action.data
    20. return newState;
    21. }
    22. if(action.type === ADD_TODO_ITEM) {
    23. const newState = JSON.parse(JSON.stringify(state));
    24. newState.list.push(newState.inputValue);
    25. newState.inputValue = '';
    26. console.log(newState);
    27. return newState;
    28. }
    29. if(action.type === DELETE_ITEM ) {
    30. const newState = JSON.parse(JSON.stringify(state));
    31. newState.list.splice(action.index, 1);
    32. return newState;
    33. }
    34. return state;
    35. }