什么网站发布任务有人做贵阳网站建设钟鼎网络
什么网站发布任务有人做,贵阳网站建设钟鼎网络,开发网站公司的简介,做音乐网站要求一、类组件和函数式组件的对比
Hook 的特性#xff1a;在编写class 的情况下#xff0c;使用state 以及其他React 特性#xff08;比如生命周期#xff09;
类组件相比于函数式组件的优势#xff1a;
类组件可以定义自己的state#xff0c;用来保存组件自己内部的状态…一、类组件和函数式组件的对比
Hook 的特性在编写class 的情况下使用state 以及其他React 特性比如生命周期
类组件相比于函数式组件的优势
类组件可以定义自己的state用来保存组件自己内部的状态。函数式组件不可以因为函数每次调用都会产生新的临时变量类组件有自己的生命周期可以在对应的生命周期中完成自己的逻辑。比如在componentDidMount 中发送网络请求并且该声明周期函数只会执行一次。函数式组件在函数中发送网络请求意味着每次重新渲染都会重新发送一次网络请求。类组件可以在状态改变时只会重新执行render 函数以及重新调用的声明周期函数componentDidUpdate 等函数式组件在重新渲染时整个函数都会被执行
二、Hooks 的使用
1、useState
在函数退出后函数中定义的变量会“消失” 而state 中的变量会被React 保留useState 接收唯一一个参数在第一次组件被调用时使用并作为初始值如果没有传递参数那么初始值为undefineduseState 的返回值是一个数组可以通过解构获取state 和setState
import { memo, useState } from react
function CounterHook(props) {const [ counter, setCounter ] useState(0)function decrement() {setCounter(counter - 1)}return (div h2当前计数: {counter}/h2button onClick{esetCount(count1)}1/buttonbutton onClick{decrement}-1/button/div)
}
export default memo(CounterHook)
2、useEffect
a、useEffect 的基本使用
useEffect 传入的回调函数会在组件被渲染完成后会自动执行effect 在每次渲染的时候都会执行
// 在组件第一次渲染、组件更新时都会执行
useEffect(() {// 当前传入的回调函数会在组件被渲染完成后会自动执行// 网络请求/DOM操作/事件监听
})
b、useEffect 传入的回调函数的返回值 清除操作
useEffect 传入的回调函数可以有一个返回值这个返回值是另外一个回调函数。这是effect 可选的清除机制每个effect 都可以返回一个清除函数这样就可以将添加和移除订阅的逻辑放在一起react 会在组件更新和卸载的时候执行清除操作
useEffect(() {console.log()// 回调函数回调函数 组件被重新渲染或者组件卸载的时候执行return () {console.log()}
}) c、一个函数式组件可以有多个useEffect
useEffect(() {console.log(修改state)
})
useEffect(() {console.log(监听redux 中的数据)return () {// 取消redux 中数据的监听}
})
d、useEffect 的两个参数effect 的性能优化
参数一执行的回调函数参数二该useEffect 在哪些state 发生变化时才重新执行受谁的影响
e、useEffect 的第二个参数是空数组时
当useEffect 的第二个参数是空数组时只在组件第一次渲染时执行类似于类组件的 componentDidMount如果useEffect 的第一个参数回调函数有返回值时只会在组件卸载时执行类似于类组件的componentWillUnmount
useEffect(() {console.log(在组件第一次渲染时执行一次)return () {console.log(在组件卸载时执行一次)}
}, [])
f、useEffect 的第二个参数不是空数组时
useEffect 的第二个参数是数组并且数组中有依赖的值useEffect 会在组件第一次渲染时执行一次并且当依赖的值发生变化时useEffect 会自动执行该useEffect 在哪些state 发生变化时才重新执行受谁的影响
useEffect(() {console.log(count 发生了变化)
}, [count])
3、useContext
组件中使用共享的Context 有两种方式
类组件可以通过类名contextType MyContext 方式在类中获取context多个Context 或者在函数式组件中通过MyContext.Consumer 方式共享context
注意事项
当组件上层最近的MyContext.Provider 更新时该Hook 会触发重新渲染并使用最新传递给MyContext provider 的context value 值
// src/context/index.js
import { createContext } from react
const UserContext createContext()
const ThemeContext createContext()
export {UserContext,ThemeCoontext
}// src/index.js
import { UserContext, ThemeContext } from /context/index.js
const root ReactDOM.createRoot(document.getElementById(root));
root.render(UserContext.Provider value{{ name: why, age: 18 }}ThemeContext.Provider value{{ color: red, size: 30 }}App//ThemeContext.Provider/UserContext.Provider
);// src/App.jsx
import { memo, useContext } from react
import { UserContext, ThemeContext } from /context/index.js
const App memo(() {// 使用contextconst user useContext(UserContext)const theme useContext(ThemeContext)return (divh2{ user.name } - { user.age }/h2div style{{ color: theme.color, fontSize: theme.size }}主题/div/div )
})
export default App
4、useReducer了解
useReducer 是useState 的一种替代方案在某些情况下如果state 的处理逻辑比较复杂时可以通过useReducer 来对其进行拆分或者这次修改的state 需要依赖之前的state 时也可以使用
import { useReducer } from react
function reducer(state, action) {switch(action.type) {case incrementreturn { ...state, counter: state.counter 1 }case decrementreturn { ...state, counter: state.counter - 1 }case add_numberreturn { ...state, counter: state.counter action.num }case sub_numberreturn { ...state, counter: state.counter - action.num }}
}
const App memo(() {const [state,dispatch] useReducer(reducer, {counter: 0})return (divh2{state.counter}/h2button onClick{e dispatch({ type: increment })}1/buttonbutton onClick{e dispatch({ type: decrement })}-1/buttonbutton onClick{e dispatch({ type: add_number, num: 5 })}5/buttonbutton onClick{e dispatch({ type: sub_number, num: 5 })}-5/button/div)
})
5、useCallback性能优化
useCallback 性能优化当需要将一个函数传递给子组件时最好使用useCallback 进行优化将优化之后的函数传递给子组件在依赖不变的情况下多次定义的时候返回的值是相同的
当修改count 时会影响子组件HYHome 重新渲染当修改message 时子组件不重新渲染
import { useCallback, useRef } from react
const HYHome memo(function(props) {// props 中的属性发生改变时组件本身就会被重新渲染const { increment } propsconsole.log(HYHome 被渲染)return (divbutton onClick{increment}increment 1/button/div)
})
const App memo(function() {const [count, setCount] useState(0)const [message, setMessage] useState(hello)// 1. 闭包陷阱const increment useCallback(function foo() {console.log(increment)setCount(count 1)}, [count])// 2. 使用useRef 实现const countRef useRef()countRef.current countconst increment useCallback(function foo() {console.log(inncrement)setCount(countRef.current 1)}, [])// 3. 普通的函数const increment () {setCount(count 1)}return (divh2计数: {count}/h2button onClick{increment}1/buttonHYHome increment{increment}/h2{ message }/h2button onCick{e setMessage(Math.random())}修改message/button/div)
})
6、useMemo
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/87664.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!