基于 vue 快速上手 React

server/2024/10/24 5:50:37/

1. Hook 函数

a. useState(响应式数据)
import {useEffect,useState} fromm "react"
function App(){const [data,setData]=useState(0)const setClick=()=>{// 1.普通修改setData(data+1)// 2.多次修改,因为 setData 是异步修改 data 值,所以需要通过回调函数的方式修改setData((value)=>value+1)setData((value)=>value+1)setData((value)=>value+1)}
return (<div onClick={setClick}>{data}</div>)
}
b. useEffect(生命周期)
import {useEffect,useState} fromm "react"
function App(){const [data,setData]=useState('this is app')// 1.没有依赖项时,表示 组件初始化加载+组件更新时的生命周期useEffect(()=>{//组件初始化加载+组件更新时console.log("没有依赖项")retrun ()=>{// 组件卸载时}})// 2.传入特定依赖项时,表示 组件初始化加载+依赖数据更新时的生命周期useEffect(()=>{//组件初始化加载+依赖数据更新时console.log("传入特定依赖项时")retrun ()=>{// 组件卸载时}},[data])// 3.传入特定依赖项为[]时,表示 组件初始化加载时useEffect(()=>{//组件初始化加载时一次console.log("传入依赖项为[]")retrun ()=>{// 组件卸载时}},[data])}
c. useMemo
// react 在更新数据时,会重新渲染执行组件
import {useMemo,useState} fromm "react"
function App(){const [count,setCount]=useState(0)
const data=useMemo(()=>{// 当 count 更新时调用 return count
},[count])
}
d. useCallback
// react 在更新数据时,会重新渲染执行组件
import {useMemo,useState} fromm "react"
function App(){// 可以防止父组件更新触发子组件更新
const changCal=useCallback(()=>{console.log("父组件更新了")
},[])return (<A changCal={changCal}></A>)
} function A({changCal}){console.log("子组件更新了")
return (<button onClick={changCal}>按钮</button>
)
} 

2. 组件间通信

1.父==>子
/**子组件通过props接受数据
*/
function Son(props){return <div>{props.name}</div>
}//父组件
function App(){const name ='this is app name'return (<Son name={name}></Son>)
}1.1插槽
/**子组件通过 props.chilren 可以接受父组件插槽传递过来的内容
*/
function Son(props){return <div>{props.chilren}</div>
}//父组件
function App(){return (<Son><div>插槽内容<div/></Son>)
}//=========================================2.子==>父
//子组件通过回调函数的方式向父组件传递信息
function Son(props){const data="this is son data"const fun=()=>{props.calback(data)}return <button onClick={fun}></button>
}//父组件向子组件传递一个函数
function App(){const callback =(value){}return (<Son callback={callback}></Son>)
}
import {createContext,useContext} from "react"
const MsgContext=createContext()//中间组件
function A(props){return <B></B>
}//底层组件通过 useContext 接受数据
import {useContext} from "react"
function B(props){// const msg=useContext(MsgContext)return (<div>{msg}</div>)
}/**
顶层组件通过 createContext 的 Provider
向底层注入数据
*/function App(){const data='this is app'return (<MsgContext.Provider value={data}><A></A></MsgContext>)
}

3. Redux 状态管理

//npm install @reduxjs/toolkit react-redux/** store.jsx文件
1.创建一个整体的大 store
*/
import {configureStore} from '@reduxjs/tookit'
import part from './part.jsx'
export default configureStore({reducer:{part:part}
})/** part.jsx文件
2.创建一个局部 store
*/
import {createSlice} from "@reduxjs/toolkit"
const partSlice=createSlice({name:'part',//初始化 store 数据initialState:{count:0,list:[]},reducers:{/**可以操作 store 数据state:store 数据action: 接受的参数*/increment:(state,action)=>{state.count++// state.count = action.payload},asyncAxios:(state,action)=>{state.list=action.payload}}
})
counst {increment,asyncAxios} =partSlice.actions//如果需要异步操作 store 数据,可以通过通过中间函数异步操作 store 数据
const asynchronous=()=>{return async (dispatch)=>{const res=await axios.get("http://")dispatch(asyncAxios(res.data))}
}export {increment,asynchronous}
export default partSlice.reducer;/** main.jsx文件
3. 通过 react-redux 建立连接
*/
import store from './store/store.jsx';
import { Provider } from 'react-redux';const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<Provider store={store}><App /></Provider>
);/**
4.使用 store 数据
useSelector 获取 store 数据
useDispatch 调用 action 方法,改变数据
*/
import { useDispatch, useSelector } from "react-redux";
import { increment,asynchronous } from "../../store/com.tsx";
const A = () => {const partStore = useSelector((state) => state.part.value)const dispatch = useDispatch()const storeClick = () => {// 同步操作 store 数据dispatch(increment())}// 异步操作 store 数据useEffect(()=>{dispatch(asynchronous())},[dispatch])return (<div><div><button onClick={storeClick}> store:  {partStore}</button></div></div>)
}

4. router 路由

import {createBrowserRouter} from 'react-router-dom'
import Home from '../views/home/index.tsx'
import Login from '../views/login/index.tsx'
const router=createBrowserRouter([{//( /:id? )此部分是 params 传参占位使用的,如若不进行 params 传参可以去掉path:'/home/:id?',element:<Home/>,// 子路由children:[]},{//( /:id? )此部分是 params 传参占位使用的,如若不进行 params 传参可以去掉path:'/login',element:<Login/>,},]
)
export default router
import {RouterProvider} from "react-router-dom"
// 导入路由表
import router from './router/index'
function App() {return (<>// 路由组件展示<RouterProvider router={router} /></>)
}
export default App
import { useNavigate } from 'react-router-dom'function Login() {const navigate = useNavigate()const loginClick=()=>{navigate('/home')// 1.query传参navigate('/home?id=123')// 2.params传参(需要在路由表中的路径中进行占位)navigate(`/home/123`)}return (<div><button onClick={loginClick}>登录</button></div>)
}
export default App
import { useSearchParams,useParams,Outlet } from 'react-router-dom'function Home() {// 1.query:接收参数const [searchParams]=useSearchParams()const id=searchParams.get('id')// 2.params:接收参数const params=useParams()return (<div>query参数: {id}params参数: {params.id}子路由的展示: <Outlet/></div>)
}
export default Home

http://www.ppmy.cn/server/134360.html

相关文章

Web3应用场景大揭秘:区块链技术的创新与突破

随着互联网技术的不断发展&#xff0c;Web3已经成为未来网络的一个重要趋势。这一阶段的互联网不仅仅是对信息的存取和传递&#xff0c;更是强调去中心化和用户控制的生态体系。区块链技术作为Web3的核心支柱&#xff0c;正通过各种应用场景推动互联网的创新与突破。本文将揭秘…

基于Matlab 疲劳检测系统

Matlab 疲劳检测系统【源码 GUI】 疲劳检查可以根据眼睛和嘴巴的张合度来判断是否疲劳 一、源代码 function varargout GUI(varargin) % GUI MATLAB code for GUI.fig % GUI, by itself, creates a new GUI or raises the existing % singleton*. % % …

安全见闻(3)——开阔眼界,不做井底之蛙

内容预览 ≧∀≦ゞ 安全见闻三&#xff1a;脚本程序与病毒声明导语脚本语言BAT/PowerShell脚本木马与宏病毒脚本病毒BIOS病毒 结语 安全见闻三&#xff1a;脚本程序与病毒 声明 学习视频来自B站UP主 泷羽sec,如涉及侵权马上删除文章 笔记的只是方便各位师傅学习知识,以下网站只…

faiss向量数据库实现rag

1&#xff09;环境准备 !pip install sentence-transformers transformers faiss-gpu 2&#xff09;代码实现 import faiss import numpy as np from sentence_transformers import SentenceTransformer from transformers import GPT2LMHeadModel, GPT2Tokenizer# 1. 加载 …

ubuntu clash 配合smartdns

下载安装clash 下载安装smartdns github 下载地址 配置 配置smartdns 设置smartdns配置端口&#xff0c;修改为没有占用的端口号&#xff0c;其他的都不用修改&#xff0c;官方推荐默认参数最佳&#xff01; 编辑vim /etc/smartdns/smartdns.conf server-name smartdns b…

Mac book英特尔系列?M系列?两者有什么区别呢

众所周知&#xff0c;Mac book有M系列&#xff0c;搭载的是苹果自研的M芯片&#xff0c;也有着英特尔系列&#xff0c;搭载的是英特尔的处理器&#xff0c;虽然从 2020 年开始&#xff0c;苹果公司逐步推出了自家研发的 M 系列芯片&#xff0c;并逐渐将 MacBook 产品线过渡到 M…

探索云计算:AWS、Azure、GCP云服务提供商详解

随着信息技术的飞速发展,云计算已成为企业数字化转型的重要支撑。AWS、Azure和GCP是当前市场上三大主要云服务提供商。本文将详细介绍这三大云服务提供商的特点、服务和使用案例,帮助企业和开发者更好地选择适合自己的云服务。 一、AWS(Amazon Web Services) AWS 是亚马逊…

【Golang】Golang的GC垃圾回收机制

文章目录 前言一、介绍二、代码解释三、GC优化方式四、总结 前言 在现代编程语言中&#xff0c;垃圾回收&#xff08;Garbage Collection, GC&#xff09;机制是一个至关重要的特性。它帮助开发者自动管理内存&#xff0c;避免内存泄漏和悬挂指针等问题。Go 语言&#xff08;G…