React 高级使用

news/2024/5/8 12:51:05/文章来源:https://blog.csdn.net/weixin_49739911/article/details/129226619

目录

useState基础使用

useEffect基础使用

自定义hook

useRef基本使用

hooks-useContext高级使用

初始化mobx

mobx模块化


 

useState基础使用

  1. 导入useState函数 ->react
  2. 调用 useState 函数,并传入状态的初始值
  3. useState函数的返回值中,拿到状态和修改状态的方法
  4. 在JSX中展示状态
  5. 调用修改状态的方法更新状态
import React,{useState} from 'react'
// 导入useState函数 ->react
// 执行函数并传参,必须在函数组件中
// [数据,修改数据方法]
// 使用数据,修改数据
function App(params) {// useState(默认值)const [count,setCount] = useState(0)const [flag,setFlag] = useState(true)const [list,setList] = useState([])function test(){setCount(count+1)setFlag(false)setList([1,2,3,4])}return (<div>{flag ? '1':'0'}{list.join("-")}<button type="" onClick={test}>{count}</button></div>)
}export default App

useEffect基础使用

  1. 导入useEffect函数
  2. 在函数组件中执行,传入回调,并定义副作用
  3. 通过修改状态更新组件时,副作用也会不断执行
  4. 依赖项控制副作用执行时机
import React,{useState,useEffect} from 'react'
// 修改数据,将count最新值放到页面标题中
// 导入useEffect函数
// 在函数组件中执行,传入回调,并定义副作用
// 通过修改状态更新组件时,副作用也会不断执行
// 依赖项控制副作用执行时机// 默认状态(无依赖项)
// 添加空数组依赖项,组件初始化执行一次
// 添加特定依赖项
// 注意事项
// 只要在useEffect回调函数中用到的数据状态,应该在依赖项数据中声明
function App(params) {// useState(默认值)const [count,setCount] = useState(0)const [name,setName] = useState('jack')useEffect (()=>{// 定义副作用document.title = countconsole.log(name);},[count,name])const [flag,setFlag] = useState(true)const [list,setList] = useState([])function test(){setCount(count+1)setFlag(false)setList([1,2,3,4])}return (<div><button type="" onClick={test}>{count}</button><button type="" onClick={()=>setName('cp')}>{name}</button></div>)
}export default App

自定义hook

  1. 自定义一个hook函数,实现获取滚动距离Y
  2. 自定义hook函数,可以自动同步到本地LocalStorage

useWindowScroll.js 

import {useState,useEffect} from 'react'
export function useWindowScroll() {const [y,setY] = useState(0)// 滚动行为发生,获取滚动值window.addEventListener('scroll',()=>{const h = document.documentElement.scrollTopsetY(h)})return [y]}
export function useLocalStorage(key,defaultValue){const [message,setMessage] = useState(defaultValue)// 数据状态改变,自动同步本地useEffect(()=>{window.localStorage.setItem(key,message)},[message,key])return [message,setMessage]}

App.js

import React,{useState,useEffect} from 'react'
import {useWindowScroll,useLocalStorage} from './hooks/useWindowScroll'
function App() {const [y] = useWindowScroll()const [message,setMessage] = useLocalStorage('hook-key','皮皮猪')setTimeout(() => {setMessage('cp')}, 5000);return (<div style={{height:"1200px"}}>{y}{message}</div>)
}
export default App

useRef基本使用

  1. 导入 useRef 函数
  2. 执行 useRef 函数并传入null,返回值为一个对象 内部有一个current属性存放拿到的dom对象(组件实例)
  3. 通过ref 绑定 要获取的元素或者组件
import React,{useState,useEffect,useRef} from 'react'
class TestC extends React.Component{state = {name:'皮皮猪'}getName = ()=>{return 'this,is '}render(){return (<div>类组件</div>)}
}
function Counter(props){const [count,setCount] = useState(()=>{return props.count})return (<div><button type="" onClick={()=>setCount(count+1)}>{count}</button></div>)}
function Test(){useEffect(()=>{let timer = setInterval(()=>{console.log(456);},1000)return ()=>{clearInterval(timer)}},[])return (<div>test </div>)
}
function App() {const testRef = useRef(null)const h1Ref = useRef(null)useEffect(()=>{console.log(testRef.current,h1Ref.current);},[])const [flag,setFlag] = useState(true)return (<div><button type="" onClick={()=> setFlag(!flag)}>切换</button> */}<TestC ref={testRef} /><h1 ref={h1Ref}>h1</h1></div>)
}
export default App

hooks-useContext高级使用

context.js

 

import {createContext} from 'react'
const Context = createContext()
export default Context

App.js

 

import React,{useState,useContext,useEffect,useRef} from 'react'
import Context from './context'
// const Context = createContext()
function ComA(){const count = useContext(Context)return (<div>ComAapp->{count}<ComC /></div>)
}
function ComC(){const count = useContext(Context)return (<div>ComCapp->{count}</div>)
}
function App() {const [count,setCount] =useState(20)return (<Context.Provider value={count}><div><ComA /><button type="" onClick={()=>setCount(count+1)}>+</button></div></Context.Provider>)
}export default App

初始化mobx

// 导入counterStore
import counterStore from './store/counter.Store'
// 导入observer方法
import { observer } from 'mobx-react-lite'function App () {return (<div className="App">{/* 渲染数据 */}{counterStore.count}{/* 使用计算属性 */}{counterStore.filterList.join(',')}<button type="" onClick={counterStore.addCount}>+</button><button type="" onClick={counterStore.addList}>修改数组</button></div>)
}export default observer(App)

mobx模块化

index.js

// 组合子模块
// 封装统一导出业务方法
import React from 'react'
import {ListStore} from './list.store'
import {CounterStore} from './counter.Store'
// 声明一个root
class RootStore{constructor(){// 对子模块实例化this.counterStore = new CounterStore()this.listStore = new ListStore()}
}// 实例化操作(样板代码)
const rootStore = new RootStore()
const context = React.createContext(rootStore)
// 通过useContext拿到rootStore实例对象,返回
// 只需要在业务组件中,调用useStore() -> rootStroe
const useStore = ()=> React.useContext(context)
export { useStore }

counter.Store.js

import { makeAutoObservable } from 'mobx'
class CounterStore{// 定义数据count = 0// 定义原始数据list = [1,2,3,4,5,6]constructor(){// 响应式数据makeAutoObservable(this)}// 定义计算属性get filterList (){return this.list.filter(item => item >2)}// 修改listaddList = ()=>{this.list.push(7,8,9)}// 定义修改数据方法addCount = ()=>{this.count++}
}
// const counterStore = new CounterStore()
export  {CounterStore}

App.js

// 导入counterStore
// import counterStore from './store/counter.Store'
// 导入observer方法
import { observer } from 'mobx-react-lite'
import {useStore} from './store/index'function App () {// 解构赋值 到store实例对象就可以const {counterStore,listStore} = useStore()// console.log(rootStore);return (<div className="App">{counterStore.count}<button type="" onClick={counterStore.addCount}>+</button></div>)
}export default observer(App)

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_74297.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

终端软件架构说

目录 零&#xff1a;前言 一&#xff0c;基于服务的架构 二&#xff0c;基于多进程多线程的架构 三&#xff0c;以数据为中心的架构 四&#xff0c;类Android的分层架构设计 五&#xff0c;总结 零&#xff1a;前言 谈到架构&#xff0c;可能大家的第一感觉是信息系统的…

redis数据结构的底层实现

文章目录一.引言二.redis的特点三.Redis的数据结构a.字符串b.hashc.listd.sete.zset(有序集合)一.引言 redis是一个开源的使用C语言编写、支持网络、可基于内存亦可持久化的日志型、key-value的NoSQL数据库。 通常使用redis作为缓存中间件来降低数据库的压力&#xff0c;除此…

STC单片机启动看门狗定时器介绍和使用

STC单片机启动看门狗定时器介绍 ✨这里以STC8系列为例。 📑看门狗复位(WDT_CONTR) WDT_FLAG:看门狗溢出标志 看门狗发生溢出时,硬件自动将此位置 1,需要软件清零。EN_WDT:看门狗使能位 0:对单片机无影响 1:启动看门狗定时器。 注意:看门狗定时器可使用软件方式启动,…

CXL互联标准简介及相关资料

毕设是实现CXL的type3扩展内存设备&#xff0c;因为CXL技术非常新&#xff0c;2019年推出&#xff0c;本专栏也是记录CXL的相关知识与一些浅薄的理解 文章目录CXL出现的背景CXL是什么其他互联总线介绍CXL胜出的原因CXL内容简介包含三种协议 CXL.io/cache/memory支持三种设备类型…

Reids实战—黑马点评(三)秒杀篇

Reids实战—黑马点评&#xff08;三&#xff09;秒杀篇 来自黑马的redis课程的笔记 【黑马程序员Redis入门到实战教程&#xff0c;深度透析redis底层原理redis分布式锁企业解决方案黑马点评实战项目】 目录Reids实战—黑马点评&#xff08;三&#xff09;秒杀篇一、全局唯一I…

DevOps实战50讲-(1)彻底理解DevOps

持续坚持原创输出&#xff0c;点击蓝字关注我吧软件质量保障:所寫即所思&#xff5c;一个阿里质量人对测试的所感所悟。浅谈软件开发流程软件开发流程是从需求分析、设计、编码、测试到上线等一系列环节的步骤和活动。通常来说&#xff0c;软件开发流程可以分为以下几个阶段&am…

Python 多进程多线程线程池进程池协程

目录 一、线程与进程很简单的介绍 1.1 线程与进程的区别 二、多进程Process 2.1 多进程与多线程的区别 2.2 多进程为啥要使用队列 2.3 控制进程运行顺序 2.3.1 join &#xff0c; 2.3.1 daemon 守护进程 2.4 进程id 2.5 进程 存活状态is_alive() 2.5 实现自定义多…

计算机图形学:liang算法和Cyrus-Beck算法

其中Cyrus-Beck算法呢&#xff0c;是计算一根直线一个多边形的交线段&#xff1b;liang算法是Cyrus的一个特例&#xff0c;即多边形刚好是矩形&#xff1b;先看看Cyrus算法的思路【从别的博客找的图片】&#xff1a;这很容易理解&#xff0c;点积>0时就可能中内部嘛&#xf…

Pyinstaller 打包EXE(七) 百篇文章学PyQT

本文章是百篇文章学PyQT6的第七篇&#xff0c;本文讲述如何使用Pyinstaller打包UI界面和代码&#xff0c;将程序打包成EXE来更为方便的进行部署&#xff0c;在写博客和学习的过程中会遇到很多问题&#xff0c;例如&#xff1a;PyQT6在网上很多博客都是PyQT5、或者PyQT4大部分都…

Amazon S3 服务15岁生日快乐!

2021年3月14日&#xff0c;作为第一个发布的服务&#xff0c;Amazon S3 服务15周岁啦&#xff01;在中国文化里&#xff0c;15岁是个临界点&#xff0c;是从“舞勺之年”到“舞象之年”的过渡。相信对于 Amazon S3 和其他的云服务15周岁也将是其迎接更加美好未来的全新起点。亚…

java面试题-JVM内存结构

整体结构&#xff1a;1.说说JVM内存整体的结构&#xff1f;线程私有还是共享的&#xff1f;JVM&#xff08;Java Virtual Machine&#xff09;内存可以分为以下几个部分&#xff1a;程序计数器&#xff08;Program Counter Register&#xff09;&#xff1a;是线程私有的&#…

深入浅出解析ChatGPT引领的科技浪潮【AI行研商业价值分析】

Rocky Ding写在前面 【AI行研&商业价值分析】栏目专注于分享AI行业中最新热点/风口的思考与判断。也欢迎大家提出宝贵的意见或优化ideas&#xff0c;一起交流学习&#x1f4aa; 大家好&#xff0c;我是Rocky。 2022年底&#xff0c;ChatGPT横空出世&#xff0c;火爆全网&a…

Linux学习(8.6)文件与目录的默认权限与隐藏权限

目录 文件与目录的默认权限与隐藏权限 文件的默认权限&#xff1a;umask chattr (配置文件隐藏属性) lsattr (显示文件隐藏属性) 文件特殊权限&#xff1a; SUID, SGID, SBIT 观察文件类型&#xff1a;file 以下内容转载自鸟哥的Linux私房菜 文件与目录的默认权限与隐藏权…

【架构师】零基础到精通——架构发展

博客昵称&#xff1a;架构师Cool 最喜欢的座右铭&#xff1a;一以贯之的努力&#xff0c;不得懈怠的人生。 作者简介&#xff1a;一名Coder&#xff0c;软件设计师/鸿蒙高级工程师认证&#xff0c;在备战高级架构师/系统分析师&#xff0c;欢迎关注小弟&#xff01; 博主小留言…

【20230225】【剑指1】分治算法(中等)

1.重建二叉树class Solution { public:TreeNode* traversal(vector<int>& preorder,vector<int>& inorder){if(preorder.size()0) return NULL;int rootValuepreorder.front();TreeNode* rootnew TreeNode(rootValue);//int rootValuepreorder[0];if(preo…

redis秒杀

redis优惠券秒杀 为什么订单表订单ID不采用自增长&#xff1f; id规律性太明显&#xff0c;容易被用户猜测到&#xff08;比如第一天下订单id10&#xff0c;第二天下订单id100&#xff0c;在昨天的1天内只卖出90商品&#xff09;受单表数据量限制&#xff08;订单数据量大&am…

从零开始学习iftop流量监控(找出服务器耗费流量最多的ip和端口)

一、iftop是什么iftop是类似于top的实时流量监控工具。作用&#xff1a;监控网卡的实时流量&#xff08;可以指定网段&#xff09;、反向解析IP、显示端口信息等官网&#xff1a;http://www.ex-parrot.com/~pdw/iftop/二、界面说明>代表发送数据&#xff0c;< 代表接收数…

chatGPT模型原理

文章目录简介BertGPT 初代GPT-2GPT-3chatGPT开源ChatGPT简介 openai 的 GPT 大模型的发展历程。 Bert 2018年&#xff0c;自然语言处理 NLP 领域也步入了 LLM 时代&#xff0c;谷歌出品的 Bert 模型横空出世&#xff0c;碾压了以往的所有模型&#xff0c;直接在各种NLP的建模…

EasyRecovery16MAC苹果版本Photo最新版数据恢复软件

无论是在工作学习中&#xff0c;还是在生活中&#xff0c;Word、Excle等办公软件都是大家很常用的。我们在使用电脑的过程中&#xff0c;有时会因自己的误删或电脑故障&#xff0c;从而导致我们所写的文档丢失了。出现这样的大家不要着急&#xff0c;今天小编就给大家推荐一款可…

FreeRTOS优先级翻转

优先级翻转优先级翻转&#xff1a;高优先级的任务反而慢执行&#xff0c;低优先级的任务反而优先执行优先级翻转在抢占式内核中是非常常见的&#xff0c;但是在实时操作系统中是不允许出现优先级翻转的&#xff0c;因为优先级翻转会破坏任务的预期顺序&#xff0c;可能会导致未…