首页 > 其他分享 >React 之 redux react-redux 使用

React 之 redux react-redux 使用

时间:2023-12-09 16:23:53浏览次数:28  
标签:react return React export import const redux

注:官方推荐使用 redux-toolkit

1、项目准备

创建项目

npx create-react-app 项目名称

安装 redux

npm install --save redux

安装 react-redux

npm install --save react-redux

2、示例: Todo 列表

入口文件

index.js

import React from "react";
import ReactDOM from "react-dom/client";
import { Provider } from "react-redux";
import { createStore } from "redux";
import App from "./App";
import todoApp from "./reducers";

let store = createStore(todoApp);

const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(
  <React.StrictMode>
    <Provider store={store}>
      <App />
    </Provider>
  </React.StrictMode>
);

Action

actions/index.js

let nextTodoId = 1;
export const addTodo = (text) => {
  return {
    type: "ADD_TODO",
    id: nextTodoId++,
    text,
  };
};

export const toggleTodo = (id) => {
  return {
    type: "TOGGLE_TODO",
    id,
  };
};

export const setVisibilityFilter = (visible) => {
  return {
    type: "SET_VISIBILITY_FILTER",
    visible,
  };
};

展示组件

components/TodoList.js

import React from "react";

// 展示列表组件

export default function TodoList({ todos, onTodoClick }) {
  return (
    <ul>
      {todos.map((item) => {
        return (
          <li
            key={item.id}
            style={{
              textDecoration: item.completed ? "line-through" : "none",
            }}
            onClick={() => {
              onTodoClick(item.id);
            }}
          >
            {item.text}
          </li>
        );
      })}
    </ul>
  );
}

components/Footer

import React from "react";

// 这里是按钮组件,用来控制显隐

export default function Footer({ hanldeClick }) {
  return (
    <div>
      <button onClick={() => hanldeClick(true)}>显示全部</button>
      <button onClick={() => hanldeClick(false)}>隐藏全部</button>
    </div>
  );
}

容器组件

containers/VisibleTodoList.js

import { connect } from "react-redux";
import TodoList from "../components/TodoList";
import { toggleTodo } from "../actions/index";

// 展示列表组件容器

// mapStateToProps 这个函数把当前 Redux store state 映射到展示组件的 props 中
const mapStateToProps = (state) => {
  return {
    todos: state.todos.filter(() => state.visible),
  };
};

// mapDispatchToProps() 方法接收 dispatch() 方法并返回期望注入到展示组件的 props 中的回调方法
const mapDispatchToProps = (dispatch) => {
  return {
    onTodoClick: (id) => {
      dispatch(toggleTodo(id));
    },
  };
};

// 使用 connect() 创建 VisibleTodoList,并传入这两个函数
const VisibleTodoList = connect(mapStateToProps, mapDispatchToProps)(TodoList);

export default VisibleTodoList;

containers/AddTodo

import React, { createRef } from "react";
import { connect } from "react-redux";
import { addTodo } from "../actions/index";

// 添加项组件容器

function AddTodo({ dispatch }) {
  const inp = createRef();

  const submit = () => {
    const text = inp.current.value;
    dispatch(addTodo(text));
  };

  return (
    <div>
      <input ref={inp} />
      <button onClick={submit}>添加</button>
    </div>
  );
}

export default connect()(AddTodo);

containers/ButtonFooter.js

import { connect } from "react-redux";
import Footer from "../components/Footer";
import { setVisibilityFilter } from "../actions";

// 控制显示隐藏的按钮容器

const mapStateToProps = (state) => {
  return {};
};

const mapDispatchToProps = (dispatch) => {
  return {
    hanldeClick: (show) => {
      dispatch(setVisibilityFilter(show));
    },
  };
};

export default connect(mapStateToProps, mapDispatchToProps)(Footer);

Reducers

reducers/todos.js

const initState = [
  {
    id: 0,
    text: '第一项',
    completed: false,
  },
];

const todos = (state = initState, action) => {
  switch (action.type) {
    case "ADD_TODO":
      return [
        ...state,
        {
          id: action.id,
          text: action.text,
          completed: false,
        },
      ];
    case "TOGGLE_TODO":
      return state.map((item) => {
        return item.id === action.id
          ? { ...item, completed: !item.completed }
          : item;
      });
    default:
      return state;
  }
};

export default todos;

reducers/visibilityFilter.js

const visibilityFilter = (state = true, action) => {
  switch (action.type) {
    case "SET_VISIBILITY_FILTER":
      return action.visible;
    default:
      return state;
  }
};

export default visibilityFilter;

reducers/index.js

import { combineReducers } from "redux";
import todos from "./todos";
import visibilityFilter from "./visibilityFilter";

// combineReducers 的作用:
// 把一个由多个不同 reducer 函数作为 value 的 object,合并成一个最终的 reducer 函数
// 然后就可以对这个 reducer 调用 createStore 方法

const todoApp = combineReducers({
  todos,
  visible: visibilityFilter,
});

export default todoApp;

标签:react,return,React,export,import,const,redux
From: https://www.cnblogs.com/zhenshu/p/17878441.html

相关文章

  • 记 react-redux redux-toolkit
    1、安装npminstall@reduxjs/toolkitreact-redux2、使用2.1创建一个ReduxStoreapp/store.jsimport{configureStore}from'@reduxjs/toolkit'exportconststore=configureStore({reducer:{},})2.2提供ReduxStore来Reactindex.jsimportReactfr......
  • React diff 算法详解
    代码参照React16.13.1什么是Diff在render阶段的beginWork函数中,会将上次更新产生的Fiber节点与本次更新的JSX对象(对应ClassComponent的this.render方法返回值,或者FunctionComponent执行的返回值)进行比较。根据比较的结果生成workInProgressFiber,即本次更新的Fiber节......
  • react antd table react-sortable-hoc DraggableBodyRow 拖拽及禁用指定行拖拽
    原文地址:基于antd树形表格table的拖拽排序效果实现-掘金(juejin.cn)思路片段:constDraggableBodyRow:React.FC<any>=({className,style,...restProps})=>{constindex=customInfoList.findIndex(({order:_index})=>_index===restProps['data-r......
  • React 中虚拟DOM是什么,为什么需要它?
    注意:本节主要讲React中的虚拟DOM,但是虚拟DOM并不是React中特有的内容。1.React中虚拟DOM是什么?虚拟DOM是对真实DOM的描述,虚拟DOM是JS对象,实际上就是JSX通过babel转换成React.createElement(),然后这个函数执行后变成的JS对象。关于JSX的介绍可以参考我的这篇文章JSX......
  • 2023最新高级难度react面试题,包含答案。刷题必备!记录一下。
    好记性不如烂笔头内容来自面试宝典-高级难度react面试题合集问:如何实现React中的组件缓存策略?在React中,我们可以使用多种策略来实现组件的缓存,包括但不限于以下几种方法:使用React.memo()React.memo()是一个高阶函数,它可以接收一个组件作为参数,并返回一个新的组件。......
  • 2023最新初级难度react面试题,包含答案。刷题必备!记录一下。
    好记性不如烂笔头内容来自面试宝典-初级难度react面试题合集问:请详述React.js是什么?React.js是一个由Facebook开发的开源JavaScript库,用于构建用户界面(UserInterface,UI)。它是目前Web开发领域最流行和广泛使用的库之一。React.js主要提供了一个虚拟DOM(Virtua......
  • 2023最新中级难度react面试题,包含答案。刷题必备!记录一下。
    好记性不如烂笔头内容来自面试宝典-中级难度react面试题合集问:请详述React中的HOC(高阶组件)的概念和应用场景?在React中,高阶组件(HighOrderComponent,简称HOC)是一种设计模式,它允许我们将共享的功能提取出来,形成一个新的可复用组件。HOC本质上就是一个接收组件作为参......
  • React 组件通信方式
    人生的游戏不在于拿了一副好牌,而在于怎样去打好坏牌,世上没有常胜将军,勇于超越自我者才能得到最后的奖杯。1.父子组件通信方式1.1父组件传递到子组件直接通过属性进行传递,数据的传递可以提高组件的复用性。1.2子组件传递到父组件通过回调函数(callback)来实现。ref标......
  • dom断点可定位react组件值修改
    react组件的值修改,也可以使用dom断点来定位。之前一直误区,认为react组件的修改,不能用dom断点来拦截,实际上在涉及到修改具体原生组件属性的时候,也可定位。例如:react组件内部使用了input组件,react组件值变化导致input的value发生改变,使用dom断点就可定位。由于input组件的属性修......
  • React 组件懒加载
    只有不断学习和成长,才能适应这个快速变化的世界。1.懒加载1.1React懒加载React中懒加载Lazy与Suspense需要搭配使用。React.lazy定义:React.1azy函数能让你像渲染常规组件一样处理动态引入的组件。其实就是懒加载。为什么代码要分割?当你的程序越来越大,代码量越......