首页 > 其他分享 >react-redux

react-redux

时间:2022-11-03 16:22:37浏览次数:47  
标签:const .. bus return react useContext import redux

前置知识

发布者订阅者模式

可用于非父子组件传值。
1.创建一个bus.js 用来放订阅者和发布者的方法。

let bus = {
  arr: [],
  // 订阅者(传入回调
  subScribe(callback) {
    this.arr.push(callback)
  },
  // 发布者(执行回调,传入参数
  publish(params) {
    this.arr.forEach(callback => {
      callback && callback(params)
    })
  }

}

export default bus

组件A

import React from 'react'
import bus from '../../utiles/bus'

export default function Add() {
  return (
    <div>

      <button onClick={() => {
        bus.subScribe((val) => {
          console.log(val)
        })
      }}>加</button>
    </div>
  )
}

组件B

import React from 'react'
import bus from '../../utiles/bus'

export default function Jian() {
  return (
    <div>
      <button onClick={() => {
        bus.publish(114514)
      }}>减</button>
    </div>
  )
}

useContext

用于向子组件传递数据,方法。配合useReducer,管理状态
什么是上下文呢?
全局变量就是全局的上下文,全局都可以访问到它;上下文就是你运行一段代码,所要知道的所有变量
使用
1.要先创建createContex
使用createContext创建并初始化
const c = React.createContext(null) // 写在组件外面

2.Provider 指定使用的范围
在圈定的范围内,传入读操作和写操作对象,然后可以使用上下文

 <C.Provider value={{n,setN}}>
      这是爷爷
      <Baba></Baba>
    </C.Provider>

3.最后使用useContext
使用useContext接受上下文,因为传入的是对象,则接受的也应该是对象

const {n,setN} = useContext(C);

案例
注意,不在一个文件中要导出,导入c

import React, { createContext, useContext, useReducer, useState } from 'react'
import ReactDOM from 'react-dom'

// 创造一个上下文
const C = createContext(null);

function App(){
  const [n,setN] = useState(0)
  return(
    // 指定上下文使用范围,使用provider,并传入读数据和写入据
    <C.Provider value={{n,setN}}>
      这是爷爷
      <Baba></Baba>
    </C.Provider>
  )
}

function Baba(){
  return(
    <div>
      这是爸爸
      <Child></Child>
    </div>
  )
}
function Child(){
  // 使用上下文,因为传入的是对象,则接受也应该是对象
  const {n,setN} = useContext(C)
  const add=()=>{
    setN(n=>n+1)
  };
  return(
    <div>
      这是儿子:n:{n}
      <button onClick={add}>+1</button>
    </div>
  )
}


ReactDOM.render(<App />,document.getElementById('root'));

useReducer

作用:配合useContext做复杂的父子通信.
在 hooks 中提供了的 useReducer 功能,可以增强 ReducerDemo 函数提供类似 Redux 的功能,引入 useReducer 后,useReducer 接受一个 reducer 函数作为参数,reducer 接受两个参数一个是 state 另一个是 action 。然后返回一个状态 count 和 dispath,count 是返回状态中的值,而 dispatch 是一个可以发布事件来更新 state 的。

count.js

import React, { useReducer } from 'react'
import Add from '../../components/reduxStudy/Add'
import Jian from '../../components/reduxStudy/Jian'


// 处理函数
const reducer = (prevState, action) => {
  let newState = { ...prevState }
  if (action.type == 'add') {
    newState.count += 1
    return newState
  } else {
    newState.count -= 1
    return newState
  }
}
// 状态
const initState = {
  count: 1
}

const TestContext = React.createContext({})

export default function Count() {
  const [state, dispatch] = useReducer(reducer, initState)
  return (
    <TestContext.Provider value={{
      state,
      dispatch
    }}>
      <div>
        <Jian></Jian>
        <Add></Add>
      </div>
    </TestContext.Provider>
  )
}

export {
  TestContext
}

add.js

import React, { useContext } from 'react'
import { TestContext } from '../../views/reduxstudy/Count'



export default function Add() {
  const { state, dispatch } = useContext(TestContext)
  return (
    <div>
      <p>{state.count}</p>
      <button onClick={() => {
        dispatch({
          type: 'add'
        })
      }}>加</button>
    </div>
  )
}

标签:const,..,bus,return,react,useContext,import,redux
From: https://www.cnblogs.com/coderz1/p/16854833.html

相关文章

  • React Native 锚点 ScrollView 实现
    引用:<AnchoranchorList={anchorContentCultureList}initCurIndex='shiming'/> Anchor.tsx代码//社区Tab下文化Tab页锚点importReact,{Rea......
  • React实战篇——二、代码分片
    二、代码分片默认情况下,npmrunbuild时,create-react-app内部使用webpack将src路径下的所有代码打包成一个js文件和一个css文件。对于一个大型应用,如果还把代码打包到一个......
  • React 组件销毁时清除订阅、定时器以及清理异步操作和取消请求等资源
    问题Warning:Can'tperformaReactstateupdateonanunmountedcomponent.Thisisano-op,butitindicatesamemoryleakinyourapplication.Tofix,cancel......
  • 深入分析React-Scheduler原理
    关键词:reactreact-schedulerscheduler时间切片任务调度workLoop背景本文所有关于React源码的讨论,基于Reactv17.0.2版本。文章背景工作中一直有在用React......
  • 经常被问到的react-router实现原理详解
    在单页面应用如日中天发展的过程中,备受关注的少了前端路由。而且还经常会被xxx面试官问到,什么是前端路由,它的原理的是什么,它是怎么实现,跳转不刷新页面的...一大堆为什么,......
  • 深度讲解React Props
    一、props的介绍当React遇到的元素是用户自定义的组件,它会将JSX属性作为单个对象传递给该组件,这个对象称之为“props”。函数声明的组件,会接受一个props形参,获取属性传递......
  • 前端面试指南之React篇(二)
    react中这两个生命周期会触发死循环componentWillUpdate生命周期在shouldComponentUpdate返回true后被触发。在这两个生命周期只要视图更新就会触发,因此不能再这两个生命......
  • React的useLayoutEffect和useEffect执行时机有什么不同
    我们先看下React官方文档对这两个hook的介绍,建立个整体认识useEffect(create,deps):该Hook接收一个包含命令式、且可能有副作用代码的函数。在函数组件主体内(这......
  • 前端面试指南之React篇(一)
    组件之间传值父组件给子组件传值在父组件中用标签属性的=形式传值在子组件中使用props来获取值子组件给父组件传值在组件中传递一个函数在子组件中用props来获取......
  • React循环DOM时为什么需要添加key
    一、React渲染流程和更新流程react渲染流程:jsx->虚拟dom->真实domreact更新流程:props/state改变->render函数重新执行->生成新的虚拟dom树->新旧虚拟dom树进......