跳至主要內容
react16.8+

useRef

import React, { useState, useEffect, useRef } from 'react'
const LikeButton: React.FC = () => {
  const [like, setLike] = useState(0)
  const likeRef = useRef(0)
  const didMountRef = useRef(false)
  const inputRef = useRef < HTMLInputElement > null
  useEffect(() => {
    document.title = `点击了${like}次`
  }, [like])
  useEffect(() => {
    if (didMountRef.current) {
      console.log('did mounted')
    } else {
      didMountRef.current = true
    }
  })
  const btnClick = () => {
    setLike(like + 1)
    likeRef.current = likeRef.current + 1
    if (inputRef && inputRef.current) {
      inputRef.current.focus()
    }
  }
  const consoleLike = () => {
    setTimeout(() => {
      console.log(like, 'like')
      console.log(likeRef)
    }, 2000)
  }
  return (
    <>
      <input type="text" ref={inputRef} />
      <button onClick={consoleLike}>console</button>
      <button onClick={btnClick}>👍 +{like}</button>
    </>
  )
}
export default LikeButton

Emilia Zhen大约 10 分钟react
react

nox 模拟器

环境变量pathandroid-SDK中的adb.exe复制到nox/bin中并改名nox_adb.exe

nox_adb contnect XX

Emilia Zhen大约 4 分钟react
开始

虚拟 DOM

每个页面在渲染的时候,在内存中会生成一个对应的对象;当页面发生改变需要重新渲染时,会在内存中重新一个对应的对象;当页面需要重新渲染时,会对比两个对象,找到有差异的地方,页面重新渲染时只去渲染发生了改变的地方

diff 算法

Diff 说明
tree diff 新旧 DOM 树,逐层对比的方式,就叫做 tree diff,每当我们从前到后,把所有层的节点对比完后,必然能够找到那些需要被更新的元素;
component diff 在对比每一层的时候,组件直接的对比叫做 component diff;当对比组件的时候,如果两个组件的类型相同,则暂时认为这个组件不需要被更新,如果组件类型不同,则立即将旧组件移除,新建一个组件,替换到被移除的位置
element diff 在组件中,每个元素之间也要进行对比,元素级别的对比叫做 element diff;
key 这个属性可以把页面上的 DOM 节点和虚拟 DOM 中的对象做一层关联关系

Emilia Zhen大约 5 分钟react