(21)Redux 入门——③ 创建 Redux 中的 store 并取得数据 | React 基础理论实操

3,006 阅读3分钟
转载请注明出处,未经同意,不可修改文章内容。

🔥🔥🔥“前端一万小时”两大明星专栏——“从零基础到轻松就业”、“前端面试刷题”,已于本月大改版,合二为一,干货满满,欢迎点击公众号菜单栏各模块了解。

涉及面试题:
如何在组件外部访问 Redux 存储的对象?

编号:[react_21]

1 创建 store

1️⃣首先,在项目中安装 Redux:
🔗Redux

21-1.png

2️⃣接着,在 src 目录下创建一个“文件夹” store ,并在 store 文件夹下创建一个“文件” index.js ——即,存放 store 代码的位置: 21-2.png

3️⃣有了存放 store 代码的位置 index.js ,我们就可以在里边用代码来创建一个数据的“公共存储仓库”:

import { createStore } from "redux"; /*
																		 3️⃣-①:从 redux 这个第三方模块中,
																		 引入 createStore 方法;
                                      */

const store = createStore(); // 3️⃣-②:调用这个方法创建一个 store;

export default store; // 3️⃣-③:将创建的 store 导出。

2 创建 reducer

4️⃣❗️❗️❗️由于 store 仅仅是一个“图书管理员”,它记不住到底应该怎么去管理数据。故,它需要一个“记录本”reducer 来辅助它去管理数据。因此,我们在创建 store 的同时,必须要把这个“记录本”一并传给 store,否则 store 什么也不知道。

4️⃣-①:所以,我们还得去创建 reducer.js 文件; 21-3.png

4️⃣-②:在 Redux 中, reducer.js 文件需要返回一个“函数”;

const defaultState = { /*
											 4️⃣-④:既然 reducer 的一个重要功能是“放置数据”,
											 那么根据之前做 TodoList 的经验,
                       TodoList 里边需要两项“默认数据”:inputValue 和 list;
                        */

	inputValue: "Hello, Oli.", // 💡为了便于讲解,我们先给这两项数据分别都设置一个初始值。
  list: [1,2,3]
};

// 4️⃣-⑤:上边有了“默认数据”,这里记得让“参数”state 等于 defaultState;
export default (state = defaultState, action) => { /*
																		 4️⃣-③:返回的“函数”接受两个固定参数:
																		 state 和 action。
                                     state 指:整个仓库里存储的数据(可以形象地理解为,“记录本”
                                     里记录的“图书馆”中所有的书籍信息);
                                     
                                     action 指:❗️这个下篇文章讲解,这里先掌握 state。
                                                    */
  
  return state; // 🚀默认返回 state。
}

4️⃣-⑥:同时,在前边创建 store 的时候index.js ),我们要把“记录本”reducer 传递给 store,并将 reducer 作为第一个“参数”传递给“方法” createStore()

import { createStore } from "redux"; 

import reducer from "./reducer"; // 🚀从当前目录下的 reducer.js 引入 reducer。

const store = createStore(reducer); // ❗️❗️❗️将 reducer 作为第一个“参数”传递给“方法”createStore!

export default store; 

4️⃣-⑦:既然把“记录本”reducer 传递给了 store,那么 store 就知道这个仓库里边有 inputValue 和 list 这两个数据了;


3 取得并显示数据

5️⃣通过以上的步骤,store 里边就有数据。一旦有了数据,各“组件”就可以连接 store,去 store 里边取数据并显示出来。

5️⃣-①:打开 TodoList.js 文件,将里边之前“写死”的数据删除掉;

// const data = [
//   'Racing car sprays burning fuel into crowd.',
//   'Japanese princess to wed commoner.',
//   'Australian walks 100km after outback crash.',
//   'Man charged over missing wedding girl.',
//   'Los Angeles battles huge wildfires.',
// ];

5️⃣-②:在 TodoList.js 里引入 store,以便在里边取数据;

import store from "./store"; // 🚀从当前文件夹下的 store 目录里的 index.js 中引入 store。

继续在 TodoList.js 中编写代码:

import React, {Component} from "react";
import 'antd/dist/antd.css';

import { Input, Button, List } from 'antd';  

import store from "./store"; /*🚀引入 store。*/

class TodoList extends Component {
  constructor(props) {
    super(props);
    
    this.state = store.getState(); /*
    															 5️⃣-③:在 TodoList.js 里,
                                   可以利用 store 提供给我们的 getState 方法
                                   来获取到 store 中的数据;
                                   ❗️即,组件中 state 数据的来源为 store 中的数据!
                                    */
  }
  
  render() {
    return (
      <div style={{marginTop: "10px", marginLeft: "10px"}}>
        <div>
          {/* 5️⃣-④:将获取到的数据 inputValue 展示在页面上; */}
          <Input value={this.state.inputValue} placeholder="todo info" style={{width: "300px", marginRight: "10px"}} /> 
          
          <Button type="primary">提交</Button>  

          {/* 5️⃣-⑤:将获取到的数据 list 展示在页面上; */}
          <List style={{marginTop: "10px", width: "300px"}} 

            bordered
            dataSource={this.state.list}
            renderItem={item => <List.Item>{item}</List.Item>}
          />
          

        </div>
      </div>
    )
  }
}

export default TodoList;

看下最后的效果: 21-4.png

下一篇,我们会详细讲解本篇的遗留问题 action。利用它,我们就可以做出“在页面 input 输入框输入内容,点击“提交”后,内容就会显示在“列表项”里”的效果。

祝好,qdywxs ♥ you!