이 글에서는 React Hook의 useEffecfa 함수를 소개하고 useEffecfa 함수의 사용법에 대해 이야기해보겠습니다.
useEffect
useEffecf의 기본 사용법
위에서 계속해서, 이전 글에서 State Hook을 설명했는데, 이미 이 Hook 상태를 통해 기능적 구성요소에서 정의할 수 있습니다. . [관련 권장사항: Redis 동영상 튜토리얼, 프로그래밍 동영상]
클래스 컴포넌트에 생명주기 함수가 있을 수 있다는 것을 알고 있는데, 함수 컴포넌트의 생명주기와 유사한 이러한 함수를 어떻게 정의할 수 있을까요?
이제 요구 사항이 있는 경우: 페이지의 제목에 항상 카운터 수를 표시하고 클래스 구성 요소와 후크를 사용하여 각각 구현합니다Effect Hook을 사용하면 클래스의 수명 주기와 유사한 일부 기능을 완료할 수 있습니다.
사실 네트워크 요청, 수동 DOM 업데이트 및 일부 이벤트 모니터링은 모두 React DOM 업데이트의 부작용입니다. 이러한 기능을 완료하는 것을 효과 후크라고 합니다.
:
클래스 구성 요소 구현Function 구성 요소와 Hook 구현:import React, { PureComponent } from 'react' export class App extends PureComponent { constructor() { super() this.state = { counter: 100 } } // 进入页面时, 标题显示counter componentDidMount() { document.title = this.state.counter } // 数据发生变化时, 让标题一起变化 componentDidUpdate() { document.title = this.state.counter } render() { const { counter } = this.state return ( <div> <h2 id="counter">{counter}</h2> <button onClick={() => this.setState({counter: counter+1})}>+1</button> </div> ) } } export default App
useEffect Hook을 통해 React가 렌더링 후 특정 작업을 수행해야 함을 알릴 수 있습니다.
- useEffect에서는 DOM 업데이트 후 React에서 실행할 콜백 함수를 전달해야 합니다. 작업이 완료되면(
구성 요소가 렌더링된 후- ) 이 함수가 다시 호출됩니다.
네트워크 요청, DOM 운영, 이벤트 모니터링기본적으로
첫 번째 렌더링 이후이든 각 업데이트 이후이든 이 콜백 함수는 일반적으로 우리는 이 콜백 함수에 부작용 작업(- 등)을 작성합니다.
默认情况下
,无论是第一次渲染之后,还是每次更新之后,都会执行这个回调函数; 一般情况下我们在该回调函数中都是编写副作用的操作(例如网络请求, 操作DOM, 事件监听)因此需要注意的是, 有许多说法说useEffect就是用来模拟生命周期的, 其实并不是; useEffect可以做到模拟生命周期, 但是他主要的作用是用来执行副作用的
import React, { memo, useEffect, useState } from 'react' const App = memo(() => { const [counter, setCounter] = useState(200) // useEffect传入一个回调函数, 在页面渲染完成后自动执行 useEffect(() => { // 一般在该回调函数在编写副作用的代码(网络请求, 操作DOM, 事件监听) document.title = counter }) return ( <div> <h2 id="counter">{counter}</h2> <button onClick={() => setCounter(counter+1)}>+1</button> </div> ) }) export default App
清除副作用(Effect)
在class组件的编写过程中,某些副作用的代码,我们需要在componentWillUnmount中进行清除:
比如我们之前的事件总线或Redux中手动调用subscribe;
都需要在componentWillUnmount有对应的取消订阅;
Effect Hook通过什么方式来模拟componentWillUnmount呢?
useEffect传入的回调函数A
本身可以有一个返回值,这个返回值是另外一个回调函数B
:
type EffectCallback = () => (void | (() => void | undefined));
为什么要在 effect 中返回一个函数?
这是 effect 可选的清除机制。每个 effect 都可以返回一个清除函数;
如此可以将
添加和移除
订阅的逻辑放在一起;它们都属于 effect 的一部分;
React 何时清除 effect?
React 会在组件更新和卸载的时候执行清除操作, 将上一次的监听取消掉, 只留下当前的监听 ;
正如之前学到的,effect 在每次渲染的时候都会执行;
import React, { memo, useEffect } from 'react' const App = memo(() => { useEffect(() => { // 监听store数据发生改变 const unsubscribe = store.subscribe(() => { }) // 返回值是一个回调函数, 该回调函数在组件重新渲染或者要卸载时执行 return () => { // 取消监听操作 unsubscribe() } }) return ( <div> <h2 id="App">App</h2> </div> ) }) export default App
使用多个useEffect
使用Hook的其中一个目的就是解决class中生命周期经常将很多的逻辑放在一起的问题:
比如网络请求、事件监听、手动修改DOM,这些往往都会放在componentDidMount中;
一个函数组件中可以使用多个Effect Hook,我们可以将逻辑分离到不同的useEffect中:
import React, { memo, useEffect } from 'react' const App = memo(() => { // 监听的useEffect useEffect(() => { console.log("监听的代码逻辑") return () => { console.log("取消的监听代码逻辑") } }) // 发送网络请求的useEffect useEffect(() => { console.log("网络请求的代码逻辑") }) // 操作DOM的useEffect useEffect(() => { console.log("操作DOM的代码逻辑") }) return ( <div> App </div> ) }) export default App
Hook允许我们按照代码的用途分离它们, 而不是像生命周期函数那样, 将很多逻辑放在一起:
그래서 많은 말이 있다는 점에 유의해야 합니다. useEffect는 수명주기를 시뮬레이션하는 데 사용되지만 실제로는 그렇지 않습니다. useEffect는 수명주기를 시뮬레이션할 수 있지만 주요 기능은 부작용을 수행하는 것입니다React将按照 effect 声明的顺序
依次调用
import React, { memo, useEffect, useState } from 'react'
const App = memo(() => {
const [counter, setCounter] = useState(100)
// 发送网络请求的useEffect, 只有在counter发生改变时才会重新执行
useEffect(() => {
console.log("网络请求的代码逻辑")
}, [counter])
return (
<div>
<h2 id="nbsp-setCounter-counter-counter"> setCounter(counter+1)}>{counter}</h2>
</div>
)
})
export default App
Clear Side 효과(Effect)클래스 구성 요소를 작성하는 동안 우리는 componentWillUnmount
에서 특정 부작용 코드를 지워야 합니다:Effect Hook은 어떻게 componentWillUnmount를 시뮬레이션하나요?예를 들어, 이전 이벤트 버스나 Redux에서 수동으로 구독을 호출하는 것,
둘 다 있습니다.
useEffect
콜백 함수 A
자체는 반환 값을 가질 수 있으며 이 반환 값은 또 다른 입니다. 콜백 함수 B
:type EffectCallback = () => (void | (() => void | undefine));
🎜🎜🎜함수를 반환하려는 이유 효과가 있나요?🎜🎜🎜🎜이것은 선택적 효과 제거 메커니즘입니다. 각 효과는 지우기 함수를 반환할 수 있습니다.🎜🎜이 방법으로 구독추가 및 제거
논리를 통합할 수 있습니다.🎜🎜이것들은 모두 효과의 일부입니다.🎜🎜🎜🎜React가 지워지는 시기 ? 효과?🎜🎜🎜🎜React는 구성 요소가 업데이트되고 제거될 때 정리 작업을 수행하여 마지막 리스너를 취소하고 현재 리스너만 남깁니다.🎜🎜전에 배운 것처럼 효과는 렌더링될 때마다 실행됩니다.🎜 🎜import React, { memo, useEffect, useState } from 'react' const App = memo(() => { const [counter, setCounter] = useState(100) // 传入空数组表示不受任何数据依赖 useEffect(() => { // 此时传入的参数一这个回调函数: 相当于componentDidMount console.log("监听的代码逻辑") // 参数一这个回调函数的返回值: 相当于componentWillUnmount return () => { console.log("取消的监听代码逻辑") } }, []) return ( <div> <h2 id="nbsp-setCounter-counter-counter"> setCounter(counter+1)}>{counter}</h2> </div> ) }) export default App🎜🎜🎜🎜다중 useEffect 사용🎜🎜🎜🎜Hook을 사용하는 목적 중 하나는 클래스의 수명 주기에서 종종 많은 논리를 함께 사용하는 문제를 해결하는 것입니다🎜: 🎜 🎜🎜예를 들어 네트워크 요청, 이벤트 모니터링 및 DOM의 수동 수정은 종종 componentDidMount에 배치됩니다. 🎜🎜🎜🎜 여러 효과 후크를 함수 구성 요소에서 사용할 수 있으며 논리를 다양한 useEffect로 분리할 수 있습니다. 🎜:🎜 rrreee 🎜🎜Hook을 사용하면 라이프 사이클 함수처럼 많은 로직을 하나로 묶는 대신 목적에 따라 코드를 분리할 수 있습니다🎜:🎜🎜🎜React는 구성 요소의 구성 요소를 순서대로호출
합니다. 효과 선언 순서에 따라 각 효과;🎜🎜🎜🎜🎜🎜🎜 useEffect 성능 최적화🎜🎜🎜🎜기본적으로 useEffect의 콜백 함수는 렌더링될 때마다 다시 실행되지만 이로 인해 두 가지 문제가 발생합니다🎜: 🎜🎜🎜일부 우리는 코드를 한 번만 실행하고 싶습니다(🎜예를 들어 네트워크 요청은 구성 요소의 첫 번째 렌더링 중에 한 번 실행될 수 있으므로 여러 번 실행할 필요가 없습니다🎜). 클래스 구성 요소의 componentDidMount 및 componentWillUnmount;🎜🎜또한 여러 번 실행하면 특정 성능 문제가 발생합니다. 🎜🎜🎜🎜useEffect를 실행해야 하는 시기와 실행하지 말아야 하는 시기를 어떻게 결정합니까? 매개변수: 🎜
- 参数一: 执行的回调函数, 这个参数我们已经使用过了不再多说;
- 参数二: 是一个数组类型, 表示 该useEffect在哪些state发生变化时,才重新执行;(受谁的影响才会重新执行)
案例练习:
受count影响的Effect;
import React, { memo, useEffect, useState } from 'react' const App = memo(() => { const [counter, setCounter] = useState(100) // 发送网络请求的useEffect, 只有在counter发生改变时才会重新执行 useEffect(() => { console.log("网络请求的代码逻辑") }, [counter]) return ( <div> <h2 id="nbsp-setCounter-counter-counter"> setCounter(counter+1)}>{counter}</h2> </div> ) }) export default App
但是,如果一个函数我们不希望依赖任何的内容时
,也可以传入一个空的数组 []:
那么这里的两个回调函数分别对应的就是componentDidMount和componentWillUnmount生命周期函数了;
import React, { memo, useEffect, useState } from 'react' const App = memo(() => { const [counter, setCounter] = useState(100) // 传入空数组表示不受任何数据依赖 useEffect(() => { // 此时传入的参数一这个回调函数: 相当于componentDidMount console.log("监听的代码逻辑") // 参数一这个回调函数的返回值: 相当于componentWillUnmount return () => { console.log("取消的监听代码逻辑") } }, []) return ( <div> <h2 id="nbsp-setCounter-counter-counter"> setCounter(counter+1)}>{counter}</h2> </div> ) }) export default App
总结: useEffect可以模拟之前的class组件的生命周期(类似而不是相等), 并且它比原来的生命周期更加强大, 青出于蓝而胜于蓝
更多编程相关知识,请访问:编程教学!!
위 내용은 React Hook의 useEffecfa 함수 사용에 대한 간략한 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

웹 개발에서 JavaScript의 주요 용도에는 클라이언트 상호 작용, 양식 검증 및 비동기 통신이 포함됩니다. 1) DOM 운영을 통한 동적 컨텐츠 업데이트 및 사용자 상호 작용; 2) 사용자가 사용자 경험을 향상시키기 위해 데이터를 제출하기 전에 클라이언트 확인이 수행됩니다. 3) 서버와의 진실한 통신은 Ajax 기술을 통해 달성됩니다.

보다 효율적인 코드를 작성하고 성능 병목 현상 및 최적화 전략을 이해하는 데 도움이되기 때문에 JavaScript 엔진이 내부적으로 작동하는 방식을 이해하는 것은 개발자에게 중요합니다. 1) 엔진의 워크 플로에는 구문 분석, 컴파일 및 실행; 2) 실행 프로세스 중에 엔진은 인라인 캐시 및 숨겨진 클래스와 같은 동적 최적화를 수행합니다. 3) 모범 사례에는 글로벌 변수를 피하고 루프 최적화, Const 및 Lets 사용 및 과도한 폐쇄 사용을 피하는 것이 포함됩니다.

Python은 부드러운 학습 곡선과 간결한 구문으로 초보자에게 더 적합합니다. JavaScript는 가파른 학습 곡선과 유연한 구문으로 프론트 엔드 개발에 적합합니다. 1. Python Syntax는 직관적이며 데이터 과학 및 백엔드 개발에 적합합니다. 2. JavaScript는 유연하며 프론트 엔드 및 서버 측 프로그래밍에서 널리 사용됩니다.

Python과 JavaScript는 커뮤니티, 라이브러리 및 리소스 측면에서 고유 한 장점과 단점이 있습니다. 1) Python 커뮤니티는 친절하고 초보자에게 적합하지만 프론트 엔드 개발 리소스는 JavaScript만큼 풍부하지 않습니다. 2) Python은 데이터 과학 및 기계 학습 라이브러리에서 강력하며 JavaScript는 프론트 엔드 개발 라이브러리 및 프레임 워크에서 더 좋습니다. 3) 둘 다 풍부한 학습 리소스를 가지고 있지만 Python은 공식 문서로 시작하는 데 적합하지만 JavaScript는 MDNWebDocs에서 더 좋습니다. 선택은 프로젝트 요구와 개인적인 이익을 기반으로해야합니다.

C/C에서 JavaScript로 전환하려면 동적 타이핑, 쓰레기 수집 및 비동기 프로그래밍으로 적응해야합니다. 1) C/C는 수동 메모리 관리가 필요한 정적으로 입력 한 언어이며 JavaScript는 동적으로 입력하고 쓰레기 수집이 자동으로 처리됩니다. 2) C/C를 기계 코드로 컴파일 해야하는 반면 JavaScript는 해석 된 언어입니다. 3) JavaScript는 폐쇄, 프로토 타입 체인 및 약속과 같은 개념을 소개하여 유연성과 비동기 프로그래밍 기능을 향상시킵니다.

각각의 엔진의 구현 원리 및 최적화 전략이 다르기 때문에 JavaScript 엔진은 JavaScript 코드를 구문 분석하고 실행할 때 다른 영향을 미칩니다. 1. 어휘 분석 : 소스 코드를 어휘 단위로 변환합니다. 2. 문법 분석 : 추상 구문 트리를 생성합니다. 3. 최적화 및 컴파일 : JIT 컴파일러를 통해 기계 코드를 생성합니다. 4. 실행 : 기계 코드를 실행하십시오. V8 엔진은 즉각적인 컴파일 및 숨겨진 클래스를 통해 최적화하여 Spidermonkey는 유형 추론 시스템을 사용하여 동일한 코드에서 성능이 다른 성능을 제공합니다.

실제 세계에서 JavaScript의 응용 프로그램에는 서버 측 프로그래밍, 모바일 애플리케이션 개발 및 사물 인터넷 제어가 포함됩니다. 1. 서버 측 프로그래밍은 Node.js를 통해 실현되며 동시 요청 처리에 적합합니다. 2. 모바일 애플리케이션 개발은 재교육을 통해 수행되며 크로스 플랫폼 배포를 지원합니다. 3. Johnny-Five 라이브러리를 통한 IoT 장치 제어에 사용되며 하드웨어 상호 작용에 적합합니다.

일상적인 기술 도구를 사용하여 기능적 다중 테넌트 SaaS 응용 프로그램 (Edtech 앱)을 구축했으며 동일한 작업을 수행 할 수 있습니다. 먼저, 다중 테넌트 SaaS 응용 프로그램은 무엇입니까? 멀티 테넌트 SAAS 응용 프로그램은 노래에서 여러 고객에게 서비스를 제공 할 수 있습니다.


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

MinGW - Windows용 미니멀리스트 GNU
이 프로젝트는 osdn.net/projects/mingw로 마이그레이션되는 중입니다. 계속해서 그곳에서 우리를 팔로우할 수 있습니다. MinGW: GCC(GNU Compiler Collection)의 기본 Windows 포트로, 기본 Windows 애플리케이션을 구축하기 위한 무료 배포 가능 가져오기 라이브러리 및 헤더 파일로 C99 기능을 지원하는 MSVC 런타임에 대한 확장이 포함되어 있습니다. 모든 MinGW 소프트웨어는 64비트 Windows 플랫폼에서 실행될 수 있습니다.

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

WebStorm Mac 버전
유용한 JavaScript 개발 도구

Dreamweaver Mac版
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)
