Day 13 - 那个被我忘记的 ref / useRef / createRef 下

如果有错误,欢迎留言指教~ Q_Q 还没写完辣

What’s useRef?

https://ithelp.ithome.com.tw/upload/images/20210810/20123314244HrgCi1t.jpg

在 React 里希望用 immutable 的方式,避免会有 side effect ,防止有改变了,而 React 不知道这件事情!

而 ref 为什麽是 mutableRefObject 呢?
因为他就是专门拿来处理 immutable 处理不了的事情
→ 当资料被改变时,不希望画面被重新渲染

*** mutable → 可以用 = 来改值(?)

const valueRef = useRef(initialValue);

valueRef 拥有 mutable 的值在 .current 属性(此时此刻的值),暂存在 ref 里

回传的 valueRef.current 在 component 的生命周期将保持不变

useRef 则是用来储存 ref,保存特定状态立 flag

在之前的章节提到,我们会用 useState 来保存内部的状态

但是当 useState 的值会变动时,就会造成画面重新渲染!!!

可是有时候我们不想要画面一直被变动啊~~~


// 还没想到

const Home = () => {
    
    const [data, setData] = useState([]);
    const submittingRef = useRef(false);
    
    // 送资料
    useEffect(()=>{
      // 如果不是送资料,fetchSetData,就不能执行
      if(!submittingRef.current) return false;
        
      fetchSetData(data)
      .then(data => submittingRef.current = false);
        
    },[data]);
    
    // 预设资料
    useEffect(()=>{
        fetchData(setData)
    },[]);
    
    
    return (
        <div className="app">
            <Edit add={add={setData} submittingRef={submittingRef} />
            <List listData{data} deleteData={setData} submittingRef={submittingRef}/>
        </div>
    )
}

这就是为什麽我们需要 useRef

useRef 改变 .current 属性不会触发 render,每次 render 都会给你同一个的 ref object。

因为我们需要一个参考的状态,来判断这时候需不需要改变,但又不造成画面无谓 render

useRef 可以拿来当 this 来用

// useRef

...


// this
   startAutoPlay = () => {
    this.stopAutoPlay();

    this.timerID = setInterval(() => {
      this.handleClickToNext();
    }, this.props.delay);
  };

  stopAutoPlay = () => {
    clearInterval(this.timerID);
  };

另外,在 class component 里,有个 createRef,就是 React Hook 的 useRef
useRef 仅能用在 Function Component, createRef 则用在 Class Component。

最後:

建议少用ref!Mutable越多,对 React 来说的维护性会越差~

参考连结:

  1. https://zh-hant.reactjs.org/docs/hooks-reference.html#useref
  2. https://zh-hant.reactjs.org/docs/hooks-faq.html#is-there-something-like-instance-variables
  3. https://zh-hant.reactjs.org/docs/refs-and-the-dom.html

<<:  [Day13]空值转换函数

>>:  如何衡量万事万物 (7) 误差

Day 24 - Travserable

在介绍 Task Monad 前,来介绍一个重要的概念, 想像一下,有一组阵列里面的项目都是 use...

Day24 - Toast

Toast功能是可以在萤幕的下方显示一段即时的讯息文字 但文字会在几秒後消失 在Toast跳出来时,...

Day 03 认识你的消费者

为什麽要建立品牌的搜寻广告活动 让使用者在搜索您的商家时可以直接进到您的商家官网,避免当使用者在搜索...

Day5 利用 Vscode 执行 PHP

真的是大坑,从我开始学程序起,就都是用Vscode这个IDE,也因此我蛮习惯用这个IDE,不想再换别...

[Day 12] 实作 API Response 及 i18n Response Message

定义 API Response 格式 API Response 的格式没有标准答案,网路上已经有许多...