Day15 Hook-useRef

Hook的useRef函式用於function component有分两种方式做介绍,
请先在要使用的元件js档前import引入喔!
(因为之後范例要使用其他Hook函式,就一次全部引入)

import React, { useRef,useState,useEffect } from 'react';

功能1 - 取得DOM元素

再复习一次,React的function component在资料变动後,元件也会被重新渲染,元件中Html的DOM节点当然也是,虽然结构看起来没有变化,Html的DOM里面的位址也被重新指向了,你画面上的DOM不是原来的DOM啊!

所以,我们利用useRef将DOM以ref物件回传,这个ref物件不会因为元件更新而被重新创造,利用回传ref物件中唯一属性current,就能得到第一次渲染时取得的最原始的DOM节点了。

使用方法

宣告一个变数接收useRef()的回传值,用在取得DOM的useRef()我们通常会给他初始值 null ,表示ref物件里的current是空的。(Hook函式请写在function component之中)

const refText =useRef(null)

接着在JSX中的html tag放上ref属性绑定(我加上useState放资料跟一个函式看改变资料跟看console.log)

const [count,setCount]=useState(0)
const stateChange =()=>{ 
      console.log(refText.current)
      setCount(count+1)
    }

 return (
    <div >
			<button onClick={stateChange}>
	      Press Me to change state
	    </button>

      <p id='check' ref={refText}> //绑定!
      state:{count}
	    </p>

    </div>
  );

DOM的资讯就会被存放在ref物件的current之中了

console.log( refText.current )看一下
https://ithelp.ithome.com.tw/upload/images/20210930/20140303YqSazr6Pyg.png

得到DOM了!


功能2 - 储存资料

奇怪不是有useState了,为什麽要用useRef存资料?
因为useRef有个特性,由useRef 建立出来的资料在被改变时并不会重新渲染画面。
当你想储存某些会变动的数据。但却不想重新渲染元件的情前下,就能用useRef储存资料。

将useRef.current的初始资料设为1,代表第一次的点击

const refData =useRef(0)

方法一的范例中加入使用refData对照的code

const [count,setCount]=useState(0)
const stateChange =()=>{ 
      setCount(count+1)
    }

/*变动refData资料*/
    const refChange=()=>{
      refData.current=refData.current+1
			console.log('ref点击次数:',refData.current)
    }

return (
    <div >
      <button onClick={stateChange}>
      Press Me to change state
    </button>
    
      <p id='check' ref={refText}>
      state:{count}
	    </p>

	//refData资料变动显示的code
    <button onClick={refChange}>
      Press Me to change ref
    </button>
      <p >
      ref:{refData.current}
    </p>

    </div>
  );

从下面画面看到,我已经点击下方按钮3次了,但画面都没更新
https://ithelp.ithome.com.tw/upload/images/20210930/20140303KRPdVes2pH.png

让我点击上方按钮更新useState的资料
https://ithelp.ithome.com.tw/upload/images/20210930/20140303qej7Sn0Tc0.png

当useState资料变动後,component才重新渲染元件,把useRef改变的值渲染到画面上。

下面是元件js档中完整的code

import React, { useRef ,useState,useEffect} from 'react';

function UseRef() {

  const [count,setCount]=useState(0)

   const refText =useRef(null)
   const refData =useRef(0)

    const stateChange =()=>{ 
      console.log(refText.current)
      setCount(count+1)
    }
    const refChange=()=>{
      refData.current=refData.current+1
      console.log('ref点击次数:',refData.current)
    }

  return (
    <div >
      <button onClick={stateChange}>
      Press Me to change state
    </button>
    
      <p id='check' ref={refText}>
      state:{count}
    </p>
    <button onClick={refChange}>
      Press Me to change ref
    </button>
      <p >
      ref:{refData.current}
    </p>
    </div>
  );
}

export default UseRef

<<:  那些被忽略但很好用的 Web API / PostMessage

>>:  Day15 - [丰收款] 撰写Django的Model,使用ORM和Heroku Postgres绑一起。

Day30练习java-魔方阵+心得

原本想说都最後一天了,就写个心得就好了ㄅ,但是同学突然问我要不要写写看魔方阵,引起我的好奇心想说试试...

# TypeScript 能手养成之旅 Day 15 介面(Interface)

前言 上一篇结束後已经将型别部分,大致上了解差不多了,铁人文章也来到一半了。今天开始下半部的铁人,会...

Day-07 说明Ruby 的include, extend,require差别?

Ruby 里面有多种引入 Module 方式,他们的差别是什麽呢? Include: 当一个 cla...

[Angular] Day30. Angular Module(一)

在 Angular 中应用程序是模块化的,Angular 有自己的模块化系统称为 NgModule,...

Advanced Customization

SuiteFlow SuiteFlow 可以用来客制化不同的工作流程(workflow). Work...