


Apakah perbezaan antara cangkuk tindak balas dan kelas?
Perbezaan: 1. Cangkuk ditulis lebih ringkas daripada kelas; 2. Kod perniagaan cangkuk lebih diagregatkan daripada kelas 3. Penggunaan semula logik komponen kelas biasanya menggunakan prop render dan HOC, manakala cangkuk tindak balas menyediakan Penggunaan cangkuk tersuai untuk menggunakan semula logik.
Persekitaran pengendalian tutorial ini: sistem Windows 7, bertindak balas versi 17.0.1, komputer Dell G3.
Apakah perbezaan antara cangkuk tindak balas dan komponen kelas? Mari bandingkan cangkuk tindak balas dan komponen kelas dan bercakap tentang perbezaannya.
Masalah yang diselesaikan dengan react-hooks
Komponen fungsi tidak boleh mempunyai keadaannya sendiri. Sebelum cangkuk, komponen fungsi adalah tanpa kewarganegaraan, dan keadaan komponen induk diperoleh melalui prop, tetapi cangkuk menyediakan useState untuk mengekalkan keadaan dalaman komponen fungsi.
Kitaran hayat komponen tidak boleh dipantau dalam komponen fungsi. useEffect mengagregatkan pelbagai fungsi kitaran hayat. Kitaran hayat
komponen kelas adalah lebih rumit (perubahannya besar daripada versi 15 hingga versi 16).
Logik komponen kelas sukar untuk digunakan semula (HOC, render props).
Kebaikan mata kail berbanding kelas (perbandingan)
1. Kaedah penulisan lebih ringkas
Kami menggunakan pembilang paling ringkas Contohnya:
komponen kelas
class ExampleOfClass extends Component { constructor(props) { super(props) this.state = { count: 1 } } handleClick = () => { let { count } = this.state this.setState({ count: count+1 }) } render() { const { count } = this.state return ( <div> <p>you click { count }</p> <button onClick={this.handleClick}>点击</button> </div> ) } }
cangkuk
function ExampleOfHooks() { const [count, setCount] = useState(0) const handleClick = () => { setCount(count + 1) } return ( <div> <p>you click { count }</p> <button onClick={handleClick}>点击</button> </div> ) }
Anda boleh melihat kod untuk menggunakan cangkuk Ia lebih ringkas dan jelas daripada kod komponen kelas.
2. Kod perniagaan lebih bersepadu
Apabila menggunakan komponen kelas, ia sering berlaku bahawa fungsi muncul dalam dua fungsi kitaran hayat mungkin menyebabkannya masalah. Contohnya:
let timer = null componentDidMount() { timer = setInterval(() => { // ... }, 1000) } // ... componentWillUnmount() { if (timer) clearInterval(timer) }
Memandangkan menambah pemasa dan mengosongkan pemasa berada dalam dua fungsi kitaran hayat yang berbeza, mungkin terdapat banyak kod perniagaan lain di antaranya, jadi anda mungkin terlupa mengosongkan pemasa jika ia berada dalam komponen Kegagalan untuk menambah fungsi pemasa yang jelas semasa penyahpasangan boleh menyebabkan masalah seperti kebocoran memori dan permintaan rangkaian yang berterusan.
Tetapi menggunakan cangkuk boleh menjadikan kod lebih terpusat, lebih mudah untuk kita urus, dan tidak mudah dilupakan:
useEffect(() => { let timer = setInterval(() => { // ... }, 1000) return () => { if (timer) clearInterval(timer) } }, [//...])
3 Penggunaan semula logik yang mudah
Penggunaan semula logik komponen kelas biasanya menggunakan prop render dan HOC. Cangkuk bertindak balas menyediakan cangkuk tersuai untuk menggunakan semula logik.
Berikut ialah contoh penggunaan semula logik untuk mendapatkan kedudukan tetikus pada halaman:
Penggunaan semula props render komponen kelas
import React, { Component } from 'react' class MousePosition extends Component { constructor(props) { super(props) this.state = { x: 0, y: 0 } } handleMouseMove = (e) => { const { clientX, clientY } = e this.setState({ x: clientX, y: clientY }) } componentDidMount() { document.addEventListener('mousemove', this.handleMouseMove) } componentWillUnmount() { document.removeEventListener('mousemove', this.handleMouseMove) } render() { const { children } = this.props const { x, y } = this.state return( <div> { children({x, y}) } </div> ) } } // 使用 class Index extends Component { constructor(props) { super(props) } render() { return ( <MousePosition> { ({x, y}) => { return ( <div> <p>x:{x}, y: {y}</p> </div> ) } } </MousePosition> ) } } export default Index
Penggunaan semula kaedah cangkuk tersuai
import React, { useEffect, useState } from 'react' function usePosition() { const [x, setX] = useState(0) const [y, setY] = useState(0) const handleMouseMove = (e) => { const { clientX, clientY } = e setX(clientX) setY(clientY) } useEffect(() => { document.addEventListener('mousemove', handleMouseMove) return () => { document.removeEventListener('mousemove', handleMouseMove) } }) return [ {x, y} ] } // 使用 function Index() { const [position] = usePosition() return( <div> <p>x:{position.x},y:{position.y}</p> </div> ) } export default Index
Ia dapat dilihat dengan jelas bahawa menggunakan cangkuk adalah lebih mudah untuk digunakan semula logik, dan logiknya lebih jelas apabila digunakan.
Beberapa kegunaan API biasa bagi cangkuk
1 useState
Syntax
<. 🎜>const [value, setValue] = useState(0)
Setiap bingkai mempunyai keadaan bebasSecara peribadi, saya faham bahawa keadaan bebas setiap bingkai dilaksanakan menggunakan kaedah penutupan.
function Example() { const [val, setVal] = useState(0) const timeoutFn = () => { setTimeout(() => { // 取得的值是点击按钮的状态,不是最新的状态 console.log(val) }, 1000) } return ( <> <p>{val}</p> <button onClick={()=>setVal(val+1)}>+</button> <button onClick={timeoutFn}>alertNumber</button> </> ) }
2. useEffect
Sintaks
useEffect(() => { //handler function... return () => { // clean side effect } }, [//dep...])
Nota
- useEffect adalah tak segerak dan tidak akan dilaksanakan sehingga komponen dipaparkan
- Fungsi panggil balik useEffect hanya boleh mengembalikan fungsi pemprosesan yang mengosongkan kesan sampingan atau tidak mengembalikan
- Jika kebergantungan yang diluluskan oleh useEffect ialah tatasusunan kosong, fungsi di dalam useEffect hanya akan dilaksanakan sekali
3. useMemo, useCallback
useMemo dan useCallback digunakan terutamanya untuk mengurangkan bilangan kemas kini komponen dan mengoptimumkan prestasi komponen.- useMemo menerima fungsi panggil balik dan kebergantungan, dan fungsi panggil balik hanya akan dilaksanakan semula apabila kebergantungan berubah.
- useCallback menerima fungsi panggil balik dan kebergantungan, dan mengembalikan versi hafalan bagi fungsi panggil balik Versi yang dihafal hanya akan dihafal semula apabila kebergantungan berubah.
Sintaks
const memoDate = useMemo(() => data, [//dep...]) const memoCb = useCallback(() => {//...}, [//dep...])
比如下面这种场景,改变子组件的name值后由于父组件更新后每次都会生成新值(addAge函数会改变),所以子组件也会重新渲染。
function Parent() { const [name, setName] = useState('cc') const [age, setAge] = useState(22) const addAge = () => { setAge(age + 1) } return ( <> <p>父组件</p> <input value={name} onChange={(e) => setName(e.target.value)} /> <p>age: {age}</p> <p>-------------------------</p> <Child addAge={addAge} /> </> ) } const Child = memo((props) => { const { addAge } = props console.log('child component update') return ( <> <p>子组件</p> <button onClick={addAge}>click</button> </> ) })
使用useCallback优化
function Parent() { const [name, setName] = useState('cc') const [age, setAge] = useState(22) const addAge = useCallback(() => { setAge(age + 1) }, [age]) return ( <> <p>父组件</p> <input value={name} onChange={(e) => setName(e.target.value)} /> <p>age: {age}</p> <p>-------------------------</p> <Child addAge={addAge} /> </> ) } const Child = memo((props) => { const { addAge } = props console.log('child component update') return ( <> <p>子组件</p> <button onClick={addAge}>click</button> </> ) })
只有useCallback的依赖性发生变化时,才会重新生成memorize函数。所以当改变name的状态是addAge不会变化。
4、useRef
useRef类似于react.createRef。
const node = useRef(initRef)
useRef 返回一个可变的 ref 对象,其 current 属性被初始化为传入的参数(initRef)
作用在DOM上
const node = useRef(null) <input ref={node} />
这样可以通过node.current属性访问到该DOM元素。
需要注意的是useRef创建的对象在组件的整个生命周期内保持不变,也就是说每次重新渲染函数组件时,返回的ref 对象都是同一个(使用 React.createRef ,每次重新渲染组件都会重新创建 ref)。
5、useReducer
useReducer类似于redux中的reducer。
语法
const [state, dispatch] = useReducer(reducer, initstate)
useReducer传入一个计算函数和初始化state,类似于redux。通过返回的state我们可以访问状态,通过dispatch可以对状态作修改。
const initstate = 0; function reducer(state, action) { switch (action.type) { case 'increment': return {number: state.number + 1}; case 'decrement': return {number: state.number - 1}; default: throw new Error(); } } function Counter(){ const [state, dispatch] = useReducer(reducer, initstate); return ( <> Count: {state.number} <button onClick={() => dispatch({type: 'increment'})}>+</button> <button onClick={() => dispatch({type: 'decrement'})}>-</button> </> ) }
6、useContext
通过useContext我们可以更加方便的获取上层组件提供的context。
父组件
import React, { createContext, Children } from 'react' import Child from './child' export const MyContext = createContext() export default function Parent() { return ( <div> <p>Parent</p> <MyContext.Provider value={{name: 'cc', age: 21}}> <Child /> </MyContext.Provider> </div> ) }
子组件
import React, { useContext } from 'react' import { MyContext } from './parent' export default function Parent() { const data = useContext(MyContext) // 获取父组件提供的context console.log(data) return ( <div> <p>Child</p> </div> ) }
使用步骤
- 父组件创建并导出
context:export const MyContext = createContext()
- 父组件使用
provider
和value
提供值:<MyContext.provide value={{name: 'cc', age: 22}} />
- 子组件导入父组件的
context:import { MyContext } from './parent'
- 获取父组件提供的值:
const data = useContext(MyContext)
不过在多数情况下我们都不建议使用context
,因为会增加组件的耦合性。
7、useLayoutEffect
useEffect 在全部渲染完毕后才会执行;useLayoutEffect 会在 浏览器 layout之后,painting之前执行,并且会柱塞DOM;可以使用它来读取 DOM 布局并同步触发重渲染。
export default function LayoutEffect() { const [color, setColor] = useState('red') useLayoutEffect(() => { alert(color) // 会阻塞DOM的渲染 }); useEffect(() => { alert(color) // 不会阻塞 }) return ( <> <div id="myDiv" style={{ background: color }}>颜色</div> <button onClick={() => setColor('red')}>红</button> <button onClick={() => setColor('yellow')}>黄</button> </> ) }
上面的例子中useLayoutEffect会在painting之前执行,useEffect在painting之后执行。
hooks让函数组件拥有了内部状态、生命周期,使用hooks让代码更加的简介,自定义hooks方便了对逻辑的复用,并且摆脱了class组件的this问题;但是在使用hooks时会产生一些闭包问题,需要仔细使用。
【相关推荐:Redis视频教程】
Atas ialah kandungan terperinci Apakah perbezaan antara cangkuk tindak balas dan kelas?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



Konsep dan kejadian kelas dan kaedah Kelas (Kelas): digunakan untuk menerangkan koleksi objek dengan sifat dan kaedah yang sama. Ia mentakrifkan sifat dan kaedah yang biasa kepada setiap objek dalam koleksi. Objek ialah contoh kelas. Kaedah: Fungsi yang ditakrifkan dalam kelas. Kaedah pembinaan kelas __init__(): Kelas mempunyai kaedah khas (kaedah pembinaan) bernama init(), yang dipanggil secara automatik apabila kelas dijadikan instantiated. Pembolehubah instance: Dalam pengisytiharan kelas, atribut diwakili oleh pembolehubah tersebut dipanggil pembolehubah instance. Instantiation: Buat contoh kelas, objek khusus kelas. Warisan: iaitu, kelas terbitan (derivedclass) mewarisi kelas asas (baseclass)

class是python中的一个关键字,用来定义一个类,定义类的方法:class后面加一个空格然后加类名;类名规则:首字母大写,如果多个单词用驼峰命名法,如【class Dog()】。

jQuery ialah perpustakaan JavaScript klasik yang digunakan secara meluas dalam pembangunan web Ia memudahkan operasi seperti pengendalian acara, memanipulasi elemen DOM, dan melaksanakan animasi pada halaman web. Apabila menggunakan jQuery, anda sering menghadapi situasi di mana anda perlu menggantikan nama kelas elemen Artikel ini akan memperkenalkan beberapa kaedah praktikal dan contoh kod tertentu. 1. Gunakan kaedah removeClass() dan addClass() jQuery menyediakan kaedah removeClass() untuk pemadaman

Apabila menulis kod PHP, menggunakan kelas adalah amalan yang sangat biasa. Dengan menggunakan kelas, kami boleh merangkum fungsi dan data yang berkaitan dalam satu unit, menjadikan kod lebih jelas, lebih mudah dibaca dan lebih mudah diselenggara. Artikel ini akan memperkenalkan penggunaan PHPClass secara terperinci dan menyediakan contoh kod khusus untuk membantu pembaca memahami dengan lebih baik cara menggunakan kelas dalam projek sebenar untuk mengoptimumkan kod. 1. Cipta dan gunakan kelas Dalam PHP, anda boleh menggunakan kelas kata kunci untuk mentakrifkan kelas dan mentakrifkan sifat dan kaedah dalam kelas.

Ralat Vue: Tidak dapat menggunakan v-bind untuk mengikat kelas dan gaya dengan betul, bagaimana untuk menyelesaikannya? Dalam pembangunan Vue, kami sering menggunakan arahan v-bind untuk mengikat kelas dan gaya secara dinamik, tetapi kadangkala kami mungkin menghadapi beberapa masalah, seperti tidak dapat menggunakan v-bind dengan betul untuk mengikat kelas dan gaya. Dalam artikel ini, saya akan menerangkan punca masalah ini dan memberi anda penyelesaian. Pertama, mari kita fahami arahan v-bind. v-bind digunakan untuk mengikat V

Latar Belakang Baru-baru ini, kod perniagaan utama telah disulitkan untuk rangka kerja syarikat untuk mengelakkan kod kejuruteraan daripada mudah dipulihkan melalui alat penyahkompilasi seperti jd-gui Konfigurasi dan penggunaan skim pengeliruan yang berkaitan adalah agak rumit dan terdapat banyak masalah untuk projek springboot, jadi fail kelas disulitkan dan kemudiannya Peloder kelas tersuai dinyahsulit dan dimuatkan Penyelesaian ini tidak benar-benar selamat Ia hanya meningkatkan kesukaran penyahkompilasian Ia menghalang lelaki tetapi bukan penjahat dalam rajah di bawah. Pemalam maven menyulitkan kompilasi menggunakan pemalam maven tersuai Fail kelas yang ditentukan disulitkan, dan fail kelas yang disulitkan disalin ke laluan yang ditentukan.

Bagaimana jquery menentukan sama ada elemen mempunyai kelas: 1. Tentukan sama ada elemen mempunyai kelas tertentu melalui kaedah "hasClass('classname')" 2. Tentukan sama ada elemen mempunyai kelas tertentu melalui "is('.classname ')" kaedah.
![Bagaimana untuk menyelesaikan ralat '[Vue warn]: v-bind:class/ :class'.](https://img.php.cn/upload/article/000/465/014/169300902772563.jpg?x-oss-process=image/resize,m_fill,h_207,w_330)
Bagaimana untuk menyelesaikan ralat "[Vuewarn]:v-bind:class/:class" Semasa proses pembangunan menggunakan Vue, kita sering menghadapi beberapa gesaan ralat Salah satu ralat biasa ialah "[Vuewarn]:v-bind:class Ralat "/:class". Mesej ralat ini biasanya muncul apabila kami menggunakan atribut v-bind:class atau :class, yang menunjukkan bahawa Vue tidak dapat menghuraikan nilai kelas yang kami tetapkan dengan betul. Kemudian, jika
