由Vue转React的自学文档

深入理解 React 的 useReducer:全面指南 React 提供的一个 Hook,它通常用于管理更复杂的状态更新逻辑,尤其是在状态更新依赖于多个条件或动作时,提供了更强大的功能,适合处理复杂的状态管理,尤其是当状态的更新逻辑比较复杂,或者多个状态值会相互依赖时。返回一个数组,其中第一个元素是当前的状态,第二个元素是派发(dispatch)动作的函数。如果你的组件中存在多个状态之间相互依赖,或多个状态更新时需要复杂的逻辑,相似,但更适用于处理较为复杂的状态更新。会决定如何更新状态并返回新的状态。),从而控制这两个状态的变化。是一个纯函数,通常使用。 阅读详情

react学习文档

由vue3转学react,之前从未接触过react,自学了一遍感觉还好,容易上手。
期间的一些笔记,后续有更深的见解持续更新。

组件(类组件,函数组件)

  • 组件名称首字母要大写,必须有返回值,没有写null
  • 设置默认值:function 组件名({默认值:1})/ 类组件:static defaultProps ={ 默认值:1 }
  • 实例化:类组件有实例化,函数组件没有

组件通信

父传子

  1. 父组件通过state传递值。state里设置要传递的值
  2. 给子组件标签添加属性,msg={this.state.msg1}
  3. 子组件通过props接受父组件传来的数据(类组件用this.props /函数组件通过参数)获取 ->props对象

子传父

​ 子组件调用父组件传递过来的函数,并且把想要传递的数据当成函数实参传入即可

兄弟组件通信

​ 利用共同的父组件,实现子传父,父在传子的兄弟通信

跨组件(祖孙)通信Context

​ 在嵌套组件树里,采用Context不需要通过层层props传递,就能进行数据传递。

  1. 创建Context对象,导出Provider和Consumer对象
  2. 使用Provider包含根组件提供数据
  3. 将需要用到组件,使用Consumer包裹,然后 value => 获取
//祖组件
const { Provider,Consumer } = createContext()
<Provider value={this.state.nextMsg}>
  <Brother/>
</Provider>

//孙组件
 <Consumer>
  {value => <span>{value}</span>}
</Consumer>

child属性:在组件内部使用都会自带这一属性,可以是文本,标签元素,函数,jsx

//例如父组件
<NextFather>
    <div>
 	   <p>标签</p>
	   {()=>{this.fun(id)}}
    </div>
</NextFather>

//NextFather子组件
function NextFather({children}){
    return(
       <div>
        {children}
       </div>
    )
}

生命周期

在这里插入图片描述

挂载阶段:

  1. constructor(初始化state,创建Ref,使用bind解决this问题) ,初始化最先执行,只执行一次。

  2. render (渲染UI),每次组件渲染的时候都会触发。

  3. componentDidMount(发送网络请求,Dom操作),完成渲染后执行,初始化的时候执行一次。

更新阶段:

  1. render(与挂载相同,是同一个render),每次组件都会触发
  2. componentDidUpdate(Dom操作,可以获取到更新后的Dom,不要直接调用setState),更新后渲染

卸载阶段

  1. componentWillUnmount(执行清理工作,比如清理定时器),组件卸载

hooks的一些API:

本质:让函数组件更强大更灵活的钩子,只能在函数组件(有状态)中使用。

作用:组件状态复用,class组件自身问题

注意:只能写在函数组件最外层,不能写在if,for循环判断里面(官文文档解释为react的运行机制要保持这些hooks的顺序的唯一性),可以将回调函数作为参数传递

useState

const [count, setCount] = useState(initCount);

useState传入的是当前count初始值也就是initCount(可以是初始值也可以是函数),然后返回的是最新的count,和一个修改count的方法(可以普通调用和函数调用,数据是对象类型的话,一般要结合拓展运算符复制一份)。

//三种情况
setCount(count + 1)
setCount(() => count + 1)
setCount(() => {
    return{
        ...count,
        //再对象赋值
    }
})

初始值initCount只有在首次渲染生效,后续更新会被忽略,直接调用setCount

一句话:在同步里,异步更新状态和dom,在异步里,同步更新状态和dom。

useEffect:为更好处理副作用(除了更新UI外的作用,如ajax,本地存储)

感觉像vue的nextTick。

React会在每次渲染完后调用useEffect,包括第一次加载渲染DOM。

useEffect 设计初衷是用来取代 componentDidMount 和 componentDidUpdate,它接收两个参数(fun,[]),一个处理函数,另一个关联的状态或数组,这个变了就重新执行。

加 [ ] 为行业只执行义一次的默认写法,一般用于发送请求:

useEffect(() => {
  	async function sendData() {
  		const res = await fetch('http://www.baidu.com')
        .then(response => response.json())
        .then(data => console.log(data))
  	}
    sendData()
},[])

useLayoutEffect 的作用和 useEffect 几乎差不多,几乎看不到任何差别,但它们的渲染底层逻辑就稍微不同。

具体可见这篇文章,用一个例子很清楚讲明,在性能优化上尽量选用useEffect,在解决页面渲染更新会闪烁可以用useLayoutEffect。

useRef:获取实例dom或组件方法,必须是类组件

步骤:导入useRef函数,通过ref绑定要获取的元素,执行useRef并传入null,这将会返回一个含有current属性的对象。

import React, { useRef, useEffect } from 'react'
//app组件里绑定
<UseRef1 ref={hook} />
<p ref={pRef}>useRef学习,标签实例</p>

//获取
 const pRef = useRef(null)
 const hook = useRef(null)
  useEffect(() => {
    console.log(pRef.current)
    console.log(hook.current.state.name)
  }, [])
useContext:祖孙组件响应式更新

算是对 ProviderConsumer 写法的一种优化吧,不同的是 useContext 可以将传递的数据嵌套的更深,孙组件都能拿到父组件的值,什么意思呢?

大致就是Provider 只能给 Consumer 共享数据, Consumer 下的孙组件却不行!但 useContext 却可以!

function App(){
  //父最组件用Provider为所有子孙提供value值
  return (
    <numberContext.Provider value={12}>
        <div>
        	<Son/>
        </div>
    </numberContext.Provider>
  )

function Son(){
  //子组件使用Consumer从父组件那上下文获取value
  return(
    <numberContext.Consumer>
      {value=><div>the answer is {value}</div>}
    </numberContext.Consumer>
  )
}

ProviderConsumer 在标准模式下相当于消息的发布订阅模式了,这很好理解。 useContext 则可以理解为小型的 redux

一个例子直接说明梗概。

import React, { createContext, useContext, useState } from 'react'

//1.先创建个上下文对象
const Context = createContext()

//2.在顶层app组件上,使用Providr包裹孙组件,value传值,这都是必要的
// 和之前的 Provider + Consumer 没啥区别,
const [count,setCount]=useState(10)
<Context.Provide value={count}>
      <div>
        <Son />
    	<button onClick={()=>{setCount(count+1)}}></button>
      </div>
</Context.Provider>

// 不同的是这Son组件下包含Shun组件 <Son> -> <Shun>
//3.在Shun组件里调用useContext方法,参数用父组件createContext创建出来的对象
//Context和createContext保存的变量一致
const count = useContext(Context)

function Shun(){
  //子组件使用Consumer从父组件那上下文获取value
  return(
    <numberContext.Consumer>
      the answer is {value}
    </numberContext.Consumer>
  )
}
//这样孙组件就可以显示或同步app组件的值

总结:就是父组件多了用 createContext 创建 context 对象的步骤,要用到的组件少了 Consumer 的引用,多了个 useContext 的调用,没了,就这么简单。

useReducer

const [ state,dispatch ] = useReducer(reducer, initState, init)

接收三个参数,分别为:处理状态更新的reducer,状态初始值,状态初始化函数。

有两种传递方式:不传第三个参数,如1;state数据比较复杂,可以将第二个参数作为第三个参数传入,如2。

最后,useReducer将返回两个东西,一个当前最新的状态state,一个是更新状态的dispatch。

//1.将状态初始值作为第二个参数传入
const [state, dispatch] = useReducer(
    reducer,
    {count: initState}
)
//2.惰性初始化,将第二个参数作为第三个函数传入
function init(initState){
    return {count: initState}
}

function renducer(state,action){
    switch{
        case "change":
            return {count: state.count - 1}
        case "reset":
            return init(ac)    
        //...
    }
}

function Counter({initState}){
    const [ state,dispatch ] = useReducer(reducer, initState, init)
    return(
    <>
    	<button onClick={() => dispath({type: 'change',count: initState})}></button>    
    </>
    )
}
useCallback

入参和useEffect,接收两个参数(fun,[]),一个处理函数,另一个关联的状态或数组,这个变了就重新执行。

那为啥要用useCallback:那是因为在函数组件里的函数,会随着状态值的更新而重新渲染,函数也会频繁被定义且组件通信很耗性能。使用useCallback+memo可以解决上述问题

useCallback(fn, deps) 相当于 useMemo(() => fn, deps)

useMemo(相当于vue的computed)

入参和useEffect,接收两个参数(fun,[]),一个处理函数,另一个关联的状态或数组,这个变了就重新执行。如果没有提供依赖项数组,useMemo 在每次渲染时都会计算新的值。

官方建议:不要在这个函数内部执行与渲染无关的操作,诸如副作用这类的操作属于 useEffect 的适用范畴,而不是 useMemo

useCallback + useMemo

痛点见上述

//使用Memo后确实不会影响了,但父组件传值过来呢
const Son = React.memo(function Son(){
    ...
})

//父组件:这样就不会
const childClick = useCallback(() => {}.[])
<Son click={childClick} />

路由:react-router-dom

先下载react-router-dom@6依赖,在导入import { BrowserRouter, Routes, Route, Link } from 'react-router-dom' , 基本使用如下。BrowserRouter:包裹整个路由,一个react应用只需使用一次,还有个路由模式:hashRouter

<BrowserRouter>
  <Link to="/">index</Link>
  <p></p>
  <Link to="about">about</Link>
  <Routes>
    <Route path="/" element={<Index />}></Route>
    <Route path="about" element={<About />}></Route>
  </Routes>
</BrowserRouter>

编程式导航:replace设置为true表示不保留历史记录

import { useNavigate } from 'react-router' 
const navigage = useNavigate()
  const goAbout = () => {
    navigage('/about', { replace: true })
  }

<button onClick={goAbout}>跳转到关于我</button>

编程式导航传参方式:searchParams / params

//searchParams 传参:和取参
navigage('/about?id=0001', { replace: true })
let params = useSearchParams()
let id = params.get('id')

// params 传参:和取参
navigage('/about/id/0001', { replace: true })
let params = useParams()
let id = params.id

二级路由:如果要设置一级路由默认渲染的二级路由,可如下例所示

//给URL地址about后面添加nextRouter二级路由
//在About组件内引入Outlet,再设置<Outlet />出口即可
<Route path="about" element={<About />}>
  {/* 二级路由 */}
  <Route path="nextRouter" element={<NextRouter />}></Route>
  {/* 默认二级路由 */}
  <Route index element={<Board />}></Route>
  {/* 404页面 */}
  <Route path="*" element={<NotFound />}></Route>
</Route>

mobx

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5lep4BGR-1658071112905)(C:\Users\只属于她\AppData\Roaming\Typora\typora-user-images\image-20220627223718081.png)]

校验规则第三方插件: prop-type

标签传递 Boolean值需要按对象形式传递,如 isTrue= {false},而非isTrue= “false”

可以传递任何数据,包括函数,jsx

给组件添加内置属性或方法

//添加属性验证
Module.protoTypes={
	title:Name.string
    isTrue:flag.bool
}

添加校验规则:需要另外安装第三方插件npm install prop-type ,导入prop-types包,在组件名.propTypes={} 添加校验规则。

可检验的规则有:

  • 常见类型array、bool、fun、number、obj、string
  • 基本类型:element
  • 必填项:isRequired
  • 特定结构对象:shape({})
import Proptypes from 'prop-types'
//父组件调用
<Son list={9}>
//子组件
Son.propTypes={
   list:PropTypes.arr
}

其他

#### 获取输入框value值的几种方法

  1. 通过在state 中定义变量,在输入框绑定value={this.state.component} ,和 onChange={this.changeInputValue} 事件,通过事件修改state的中变量。
  changeInputValue = (e) => {
    this.setState({
      component: e.target.value,
    })
  }
  1. 通过ref拿到。先声明myRef = React.createRef(),在input标签内绑定ref={this.myRef},最后通过this.myRef.current.value 拿到value值。
修改数组的某项状态

删除:直接filter过滤传过来的值不等于数组的值就好,或者根据索引 splice(index, 1)item项

this.setState({ list: this.state.list.filter((item) => item.id !== id) })  

修改:一般对整个数组map遍历到需要修改的项

list: this.state.list.map((item) => {
	if (item.id === id) {
		return {
			attitude: attitude === 1 ? 0 : 1,
		}
	} else {
		return item
	}
}),
前端自学路线图之前端自学大纲 文章目录前端自学路线图第一阶段:前端自学--HTML5 + CSS3第二阶段:前端自学--移动Web网页开发第三阶段:前端自学--JavaScript网页编程第四阶段:前端自学--Node.js与AJAX第五阶段:前端自学--Vue.js项目实战第六阶段:前端自学--微信小程序第七阶段:前端自学--React.js项目实战前端自学经典资源 前端自学路线图如下,前端自学需要耗费的时间和精力不比其他编... 阅读详情

相关推荐

2022年前端自学全套路线总结(黑马版)

前端完整自学路线(黑马整理版)

qq_39950127的博客 5157

useReducer 介绍和基本使用

一、前言 useReducer 是 useState 的替代方案。它接收一个形如 (state, action) => newState 的 reducer,并返回当前的 state 以及与其配套的 dispatch 方法。(如果你熟悉 Redux 的话,就已经知道它如何工作了。) const [state, dispatch] = useReducer(reducer, initialArg, init); useReducer接收两个参数: 第一个参数:reducer函数。 第二个参数:初始化

Jas3000的博客 2万+

点云结构面智能识别与裂隙网络分析系统

点云结构面智能识别系统摘要 本系统采用深度学习与传统几何算法融合的方法,实现岩石结构面的智能识别与分析。系统包含7个核心模块:点云预处理、结构面识别、分组分割、参数计算、粗糙度分析、裂隙网络生成和可视化。技术路线结合PointNet++深度学习架构与RANSAC、区域生长等传统算法,通过预处理→深度学习识别→几何精修→参数计算→网络构建的流程实现高精度分析。预处理模块实现点云降噪、下采样和法向量估计,深度学习模块基于改进的PointNet++架构进行特征提取和分类。系统支持多种点云格式输入,提供完整的结构面

huanghm88的专栏 300

Vue React不完全指北

一般 H5 的,或者一些做不大的系统,首选 Vue。因为 Vue 简单,开发效率比较高。同时 Vue 包的体积也更小,在移动端网络差异大的情况下,资源体积是非常重要的。 像一些后台系统,会越做越大的,就用 React。解决方案更多,后期也更方便迭代与维护。(本人有幸开发过 Vue 大项目,webpack 热更新一下 3mins+) 二、核心思想 Vue 早期定位是尽可能的降低前端开发的门槛(这跟 Vue 作者是独立开发者也有关系)。所以 Vue 推崇灵活易用(渐进式开发体验),数据可变,双向数据...

LeZiJie的博客 579

学习React:从VueReact

学习React:从VueReact变,最主要是记录一下自己在学习中感受到vuereact之间的差异

小杨很困的博客 1042

React(三)useReducer、useContext钩子的使用,redux库的初步使用

useContext是一个用于读取和订阅组件中的context的 Hook当组件嵌套过深又需要传递数据时,一层一层的传props是不现实的,Context允许父组件向其下层无论多深的任何组件提供信息,而无需通过 props 显式传递。这样就需要useContext,在顶层组件创建context,将context标签包裹住需要传值的子组件,这样嵌套在里面的组件就可以获取到这个context的值了本篇文章介绍了useReducer,useContext以及rudux的简单应用。

DogEgg_001的博客 3376

听听别人怎么说:VueJSReactJS

前端面试题汇总前端面试题是我面试过程中遇到的面试题,每一次面试后我都会复盘总结。

2401_84097996的博客 684

ReactVue 的区别:初学者选什么?ReactVue 分别适合什么项目?自学周期分别为多久?掌握哪些知识点就可以开发项目?

ReactVue 的区别:初学者选什么?ReactVue 分别适合什么项目?自学周期分别为多久?掌握哪些知识点就可以开发项目?初学者应该选择 React 还是 Vue? 这两者分别适合什么样的项目? 从零学习到能独立开发项目需要多长时间? 需要掌握哪些关键知识点才能开始实际开发?

猫头虎技术团队:授渔优于赠鱼,兴趣引领智慧,探索之乐尤显珍贵。商务合作+:Libin9iOak ,万粉变现+:CSDNWF,猫头虎承诺每年免费为100名C站创作者做账号流量诊断服务!全网搜:猫头虎技术团队,点击文章底部名片或直接私信我一切皆可谈,快找虎哥! 2064

自学行前端找到第一份前端工作,做得很吃力,被劝退怎么办?

此文是载的文章,点评下:自学前端应该没啥问题,主要是文中提到的兄弟手很生,完成项目进度,连简单的业务都很难完成,这样必须面对被劝退的结果。技术要是学扎实了,则可能就是个宝了。 载文章正文如下: 身边有一位朋友,自学前端行,看了很多视频和书,视频为主,自己也敲了些代码,很少,学了html,css,jsvue框架,小程序,uni-app也学习过。现在好不容易找到一份工作,手很生,完不成项目进度,一些简单的业务完成都很难,现在被领导劝退了。 其实我觉得应该是他自学的过程中很多基础的没有学扎实,学过蛮

光脚丫思考的专栏 1万+

前端学习大法!拯救你的拖延症!自学一步到位!

还在头疼前端web怎么学?在纠结报班还是自学? 别费那功夫了,这篇文章带你分步骤自学前端,视频课程自行领取 第一阶段:HTML5+CSS3 前端小白零基础入门HTML5+CSS3 配套资料:https://pan.baidu.com/s/1QXO1bA7IilPAp-zuOXHrUA提取码:qgr4 2018版Html5+Css3由浅入深教程 配套资料:https://pan.baidu.com/s/13YbZvI340xpx-8Ky508HfQ提取码:ztb6 第二阶段:移动web网..

CZ-001的博客 308

ReactJs自学笔记

ReactJs笔记,常学常忘,常忘常学,所以笔记。

曲折旅程,艰难人生 852

Vuereact的异同

核心竞争力,怎么才能提高呢?成年人想要改变生活,逆状态?那就开始学习吧~万事开头难,但是程序员这一条路坚持几年后发展空间还是非常大的,一切重在坚持。为了帮助大家更好更高效的准备面试,特别整理了《前端工程师面试手册》电子稿文件。

2301_79098879的博客 710

react学习笔记

react学习笔记

冷月心的博客 1万+

七、学习useReducer

一、什么是useReducer? ​ useReducer是react hooks中提供的一个高级hooks,即便没有这些高级hooks,只用useState、useEffect和useContext,也能完成需求。但是这些高级的hooks可以让我们的代码具有更好的可读性、可维护性、可预测性。 二、useReducer的出现是为了解决什么问题? 要理解这个问题,我们得先知道reducer是什么东西。reducer是redux中一个概念,以下就是redux更新数据的一个流程。 [外链图片存失败,源站可能有防

NinthMonee的博客 1887

11+实战技巧,让你轻松从Vue过渡到React(1),这些知识你必须拿下

3. v-for一般情况下,渲染一个列表在Vue中使用v-for指令,v-for 指令需要使用形式的特殊语法,其中items是源数据数组,而item则是被迭代的数组元素的别名。当然了,每个元素都需要设置唯一的key。

2401_84093310的博客 1077

useReducer 的奇妙世界:探索 React 状态管理的新境界(上)

useReduceruseReducer是React Hooks中的一个函数,它用于在React应用程序中实现状态管理。useReducer函数接收两个参数:一个是reducer函数,另一个是初始状态。reducer函数接收两个参数:一个是当前状态,另一个是action对象。action对象通常包含一个type属性,表示要进行的操作,以及可能的其他属性。useReducer函数返回一个数组,数组的第一个元素是当前状态,第二个元素是一个函数,该函数用于更新状态。

你若盛开,清风自来 2158

Vue 迈向 React:平滑过渡与关键注意点全解析

Vue React 是一个具有挑战性但也充满机遇的过程。通过对基础概念、语法、状态管理、路由、生态工具链、性能优化、项目结构与代码风格以及测试框架等多方面的深入对比与学习,我们能够较为系统地掌握这一换过程中的关键要点。在换过程中,需充分理解两种框架的设计理念差异,细致地调整代码和项目配置,以确保项目的顺利过渡与高效运行。前端技术领域始终处于不断发展与演进之中,VueReact 作为其中的重要代表,也在持续进化与相互影响。

yan1915766026的博客 1533

Vue React的开发者,常犯的10个错误~

这可能是很多新手都遇到过的问题了吧!鄙人当年也犯过这个错误,但你说它是错误,也可以说是react的一个坑:0 是假值,却不能做条件渲染。

2401_83384536的博客 1154

Vue React 指南

Vue React 指南

weixin_52268321的博客 2653

网络安全与黑客攻防常见设备:前置机、跳板机、堡垒机与肉鸡

前置机、跳板机、堡垒机和肉鸡,这些看似冷僻的技术名词,实则是网络安全与黑客攻防战中的关键角色。它们有的守护着企业的数字Pltform,保卫网络安全;有的则成为黑客的跳板,游走于灰色地带。

网络技术联盟站 875

用CAM350进行IPC网表对比.pdf

用CAM350进行IPC网表对比.pdf

上一篇: redux&react-redux初探
下一篇: vacode中的setting命令
雨燕容若
博客等级 码龄7年 12粉丝 · 28原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值