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

复制代码
转载请注明出处,未经同意,不可修改文章内容。

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

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

1 创建 store

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

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

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

javascript 复制代码
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 文件;

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

javascript 复制代码
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()

javascript 复制代码
import { createStore } from "redux"; 

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

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

export default store; 

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

3 取得并显示数据

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

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

javascript 复制代码
// 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,以便在里边取数据;

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

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

jsx 复制代码
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;

看下最后的效果:

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

祝好,qdywxs ♥ you!

相关推荐
Hilaku9 小时前
当 AI 一天写完一周的代码,我们还剩什么优势?
前端·javascript·程序员
无责任此方_修行中9 小时前
换个版本号就能升级?可没那简单:pnpm 11 升级踩坑记
javascript·后端·npm
尘世中一位迷途小书童9 小时前
无人机航线里的云台角度怎么调?Cesium 做了个视锥 + 鹰眼联动
前端·javascript·数据可视化
张元清9 小时前
React useMeasure Hook:用 ResizeObserver 测量 DOM 元素 (2026)
javascript·react.js
思码梁田9 小时前
CSS display 属性:从元素类型转换到隐藏元素的实用指南
前端·css·display·inline·block·none·inline-block
Csvn9 小时前
⚡ Vite 依赖预构建(optimizeDeps)的 3 个经典坑:改了源码不生效、新增依赖 404、缓存怎么清都不行
前端
A24207349309 小时前
Vue3 + TypeScript:后端数据在表格内渲染后进行增删改的完整实现步骤
前端·javascript·typescript
他们叫我 悦儿遥遥雨9 小时前
.NET 8 Web开发入门(六):Blazor 全栈开发——告别 JavaScript 焦虑
前端·javascript·.net
用户21816970493010 小时前
Flutter(九)StatelessWidget StatefullWidget
前端
paopaokaka_luck10 小时前
基于springboot3+vue3的乡村医生诊疗管理系统(AI助手、协同过滤算法、webSocket实时聊天、Echarts图形化分析)
前端·网络·人工智能·spring boot·websocket·网络协议·echarts