redux和react-redux快速入门

一、redux

1. 导包

npm i redux 
// 或 
yarn add redux

2. 创建store(仓库)和reducer(仓库管理员)

src/store/reducer.js

const defaultState = {
    num: 0 // 初始化一个数据
}
// 导出一个函数(仓库,动作)
export default (state = defaultState, action) => {
    return state
}

src/store/index.js

import { legacy_createStore as createStore } from "redux";
import redurce from "./redurce";
export default createStore(redurce)

3. 组件中使用redux

src/store/reducer.js

在reducer中定义一个事件,让组件来触发,以修改store

const defaultState = {
    num: 0
}
export default (state = defaultState, action) => {
  	// 将type和data从action对象中解构出来,方便后面使用
    const {type, data} = action;
  	// 如果action的type为add,这执行此代码,返回新的store数据
    if(type === 'add') {
      	// store的num累加传过来的数值
        state.num += data;
      	// 需要深拷贝,返回新的state数据
        let newState = JSON.parse(JSON.stringify(state))
        return newState;
    }
  	// 默认返回原state对象
    return state
}

src/App.jsx

import React, { useEffect, useState } from 'react'
// 导入 store 仓库
import store from '../store'

export default function App() {
  return (
	<div>
		// store.getState()获取store的值
		<h2>{ store.getState().num }</h2>
		// 定义一个add累加方法
      	<button onClick={() => add(2)}>+</button>
    </div>
  )
  
  const add = (data) => {
    // store.dispatch()来触发reducer中的事件,修改store
    // 需要传一个action对象,格式为 {type: name, data: xx}
    // action对象的type属性需要和reducer中action对应type一致
    store.dispatch({
      type: 'add',
      data
    })
  }
  
  // 大坑:redux中,当store数据更新后,界面数据并不会直接更新,需要手动更新
  // 初始化一个update数据使用useState(),主要是为了通过setUpdate()来更新组件
  // 模拟render()生命周期,实现组件重新加载,以更新界面的store数据
  const [update,setUpdate] = useState({})
  
  // useEffect模拟componentDidMount()生命周期
  useEffect(() => {
    // store.subscribe()是redux提供的,监测store更新的函数
    store.subscribe(() => {
      // 当store数据更新后执行 setUpdate() ,组件重新加载,实现界面store数据更新
      setUpdate({})
    })
  })
  
}

**注意:**redux中,当store数据更新后,界面数据并不会直接更新,需要手动更新

如果是函数式组件,手动更新方式如上

类式组件,使用生命周期直接在store.subscribe()中调用setState()即可实现更新数据

componentDidMount() {
    store.subscribe(() => {
      this.setState({})
    })
  }

二、react-redux(todo案例)

1. 导入依赖

redux和react-redux
还有antd

yarn add redux react-redux antd

2. code

main.tsx

import React from 'react'
import ReactDOM from 'react-dom/client'
import App from './App'
import 'antd/dist/antd.css'
// 导入Provider从react-redux中
import {Provider} from "react-redux"
// 导入store
import store from "./store";

ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render(
  <React.StrictMode>
  	// 使用Provider组件包嵌套需要使用store的组件
  	// 并且将store传进来
      <Provider store={store}>
          <App />
      </Provider>
  </React.StrictMode>
)

src/store/constant.ts

用来存储action对象的type属性

export const AddTodo = 'ADD_TODO'

src/store/index.ts

import { legacy_createStore as createStore } from "redux";
import reducer from "./reducer";
export default createStore(reducer)

src/store/reducer.ts

import {AddTodo} from "./constant";
const defaultState = {
  	// 初始化数据
    todo: [
        { id: '001', name: 'code' },
        { id: '002', name: 'sleep' }
    ]
}

export default (state = defaultState, action: {type: string, data?:any}) => {
    const {type, data} = action
    switch (type) {
        case AddTodo:
            state.todo.unshift(data)
            return JSON.parse(JSON.stringify(state))
        default:
            return state
    }
    return state
}

src/component/Todo/index.tsx

import { Button, Input, List, message  } from 'antd'
import './index.less'
import {connect} from "react-redux";
import {useState} from "react";
import {AddTodo} from "../../store/constant";
import { nanoid } from 'nanoid'

function index(props: any) {
    const data = props.todo
    const [inputTodo, setInputTodo] = useState('');
    const addTodo = () => {
        if(inputTodo.trim() === '') {
            return message.info('请输入人内容');
        }
        props.addTodo({
            id: nanoid(),
            name: inputTodo
        })
    }
    return (
        <div className='todo_container'>
            <div className="todo">
                <div className="top">
                    <Input placeholder="Basic usage" value={inputTodo} onChange={(e) => setInputTodo(e.target.value)} />
                    <Button onClick={addTodo} style={{marginLeft: '10px'}} type="primary">提交</Button>
                </div>
                <List
                    size="large"
                    bordered
                    dataSource={data}
                    renderItem={item => {
                        // @ts-ignore
                        return <List.Item>{item.name}</List.Item>
                    }}
                />
            </div>
        </div>
    )

}
// 状态映射
const mapStateToProps = (state: any) => {
    return {
        todo: state.todo
    }
}

// 事件派发映射
const mapDispatchToProps = (dispatch: {type:string, data: any}) => {
    return {
        addTodo(data: any) {
            // @ts-ignore
            dispatch({
               type: AddTodo,
               data
            })
        }
    }
}
// @ts-ignore
export default connect(mapStateToProps, mapDispatchToProps)(index)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Redux是一个独立的JavaScript库,用于管理应用程序的状态。它提供了一个可预测的状态容器,可以在整个应用程序中共享。Redux通过单向数据流来管理状态,使得状态的变化变得可控和可预测。 React-ReduxRedux的官方绑定库,它提供了一些与React集成的功能,使得在React应用中使用Redux更加方便。React-Redux提供了一个Provider组件,它可以将Redux store传递给整个应用程序。它还提供了一个connect函数,它可以将Redux store中的状态映射到React组件的props中,使得React组件可以轻松地访问Redux store中的状态。 ### 回答2: Redux是一个用于JavaScript应用程序的状态容器,它提供了一个可预测且可维护的方式来管理应用程序的状态。Redux的核心概念是“单一数据源”,即将整个应用程序的状态存储在单一对象树中,并且任何组件都可以访问和修改该状态树的任意部分。 react-redux是一个与React紧密集成的Redux绑定库。它提供了一组React组件和API,使得使用Redux在React应用程序中更加容易。 reduxreact-redux之间的关系可以理解为Redux是一种状态管理库,而react-reduxRedux与React之间的纽带。 具体来说,react-redux提供了两种主要的API:Provider和connect。 Provider是一个React组件,允许我们将应用程序的Redux存储连接到React组件树中的所有组件。在Provider组件内部,可以通过store属性传递Redux存储对象,使得所有组件都可以访问该存储。 connect是一个高阶组件,用于将React组件连接到Redux存储中的状态和操作。通过connect,我们可以在React组件中访问Redux状态,以及派发Redux操作。connect本质上是一个函数,它接收一个组件作为参数并返回一个新的连接了Redux存储的组件。 总之,reduxreact-redux之间的区别在于,redux是一个独立的状态管理库,而react-reduxRedux和React之间的桥梁,帮助React应用程序连接到Redux存储,并访问存储中的状态和操作。 ### 回答3: ReduxReact-Redux都是在React项目中使用的JavaScript库。Redux是一个JavaScript状态容器,用于管理应用程序中的所有状态。Redux允许将状态存储在一个单一的地方,以便在整个应用程序中共享该状态。React-Redux是React的一个库,用于与Redux一起使用,以便在React组件中访问和更新Redux状态。 Redux通过store提供一个单一的状态树,包含了整个应用程序的状态。通过使用store中的action和reducer,Redux可以跟踪状态的所有更改。这可以帮助开发人员更容易地调试和管理代码。但是,使用Redux需要一定的时间和精力来管理各个状态,尤其在较大的代码库中尤其如此。 React-Redux库是Redux的一个扩展,它提供了一组工具来帮助React组件访问和更新Redux状态。通过提供Provider组件,React-Redux使得Redux存储的状态可以传递到整个应用程序中的所有组件。通过使用connect函数和mapStateToProps和mapDispatchToProps参数,React-Redux允许开发人员将Redux状态映射到React组件中。这样,开发人员就可以根据需要将Redux状态作为props传递给组件,并且可以更方便地将状态更改传递回Redux store。 总之,Redux为React提供了一个易于管理的状态储存架构,以帮助应用程序开发人员管理和跟踪应用程序状态。React-Redux是一组工具,它使开发人员可以更方便地在React组件中使用Redux,从而帮助开发人员更快地开发应用程序。两者的区别在于Redux是包含整个应用程序状态的状态容器,而React-Redux则是提供了一组工具,以帮助开发人员更方便地在React组件中使用Redux状态。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值