zoukankan      html  css  js  c++  java
  • useRef获取DOM元素和保存变量(十)

    useRef在工作中虽然用的不多,但是也不能缺少。它有两个主要的作用:

    • useRef获取React JSX中的DOM元素,获取后你就可以控制DOM的任何东西了。但是一般不建议这样来作,React界面的变化可以通过状态来控制。

    • useRef来保存变量,这个在工作中也很少能用到,我们有了useContext这样的保存其实意义不大,但是这是学习,也要把这个特性讲一下。

    useRef获取DOM元素

    界面上有一个文本框,在文本框的旁边有一个按钮,当我们点击按钮时,在控制台打印出input的DOM元素,并进行复制到DOM中的value上。这一切都是通过useRef来实现。

    /src文件夹下新建一个Example8.js文件,然后先引入useRef,编写业务逻辑代码如下:

    import React, { useRef} from 'react';
    function Example8(){
        const inputEl = useRef(null)
        const onButtonClick=()=>{ 
            inputEl.current.value="Hello ,JSPang"
            console.log(inputEl) //输出获取到的DOM节点
        }
        return (
            <>
                {/*保存input的ref到inputEl */}
                <input ref={inputEl} type="text"/>
                <button onClick = {onButtonClick}>在input上展示文字</button>
            </>
        )
    }
    export default Example8
    

    当点击按钮时,你可以看到在浏览器中的控制台完整的打印出了DOM的所有东西,并且界面上的<input/>框的value值也输出了我们写好的Hello ,JSPang。这一切说明我们可以使用useRef获取DOM元素,并且可以通过useRefu控制DOM的属性和值。

    useRef保存普通变量

    这个操作在实际开发中用的并不多,但我们还是要讲解一下。就是useRef可以保存React中的变量。我们这里就写一个文本框,文本框用来改变text状态。又用useReftext状态进行保存,最后打印在控制台上。写这段代码你会觉的很绕,其实显示开发中没必要这样写,用一个state状态就可以搞定,这里只是为了展示知识点。

    接着上面的代码来写,就没必要重新写一个文件了。先用useState声明了一个text状态和setText函数。然后编写界面,界面就是一个文本框。然后输入的时候不断变化。

    import React, { useRef ,useState,useEffect } from 'react';
    
    function Example8(){
        const inputEl = useRef(null)
        const onButtonClick=()=>{ 
            inputEl.current.value="Hello ,useRef"
            console.log(inputEl)
        }
        const [text, setText] = useState('jspang')
        return (
            <>
                {/*保存input的ref到inputEl */}
                <input ref={inputEl} type="text"/>
                <button onClick = {onButtonClick}>在input上展示文字</button>
                <br/>
                <br/>
                <input value={text} onChange={(e)=>{setText(e.target.value)}} />
             
            </>
        )
    }
    
    export default Example8
    

    这时想每次text发生状态改变,保存到一个变量中或者说是useRef中,这时候就可以使用useRef了。先声明一个textRef变量,他其实就是useRef函数。然后使用useEffect函数实现每次状态变化都进行变量修改,并打印。最后的全部代码如下。

    import React, { useRef ,useState,useEffect } from 'react';
    function Example8(){
        const inputEl = useRef(null)
        const onButtonClick=()=>{ 
            inputEl.current.value="Hello ,useRef"
            console.log(inputEl)
        }
        //-----------关键代码--------start
        const [text, setText] = useState('jspang')
        const textRef = useRef()
    
        useEffect(()=>{
            textRef.current = text;
            console.log('textRef.current:', textRef.current)
        })
        //----------关键代码--------------end
        return (
            <>
                {/*保存input的ref到inputEl */}
                <input ref={inputEl} type="text"/>
                <button onClick = {onButtonClick}>在input上展示文字</button>
                <br/>
                <br/>
                <input value={text} onChange={(e)=>{setText(e.target.value)}} />
            </>
        )
    }
    
    export default Example8
    

    这时候就可以实现每次状态修改,同时保存到useRef中了。也就是我们说的保存变量的功能。那useRef的主要功能就是获得DOM和变量保存,我们都已经讲过了。你的编码能力有增加了一些,让我们一起加油。

    转自:https://jspang.com/posts/2019/08/12/react-hooks.html

  • 相关阅读:
    【JavaScript框架封装】实现一个类似于JQuery的动画框架的封装
    【JavaScript框架封装】实现一个类似于JQuery的DOM框架的封装
    【JavaScript框架封装】实现一个类似于JQuery的内容框架的封装
    【JavaScript框架封装】实现一个类似于JQuery的属性框架的封装
    【JavaScript框架封装】实现一个类似于JQuery的选择框架的封装
    【JavaScript框架封装】实现一个类似于JQuery的CSS样式框架的封装
    【JavaScript框架封装】实现一个类似于JQuery的事件框架的封装
    【JavaScript框架封装】在实现一个自己定义类似于JQuery的append()函数的时候遇到的问题及解决方案
    【JavaScript框架封装】在实现一个自己定义类似于JQuery的append()函数的时候遇到的问题及解决方案
    【JavaScript框架封装】公共框架的封装
  • 原文地址:https://www.cnblogs.com/crazycode2/p/11783246.html
Copyright © 2011-2022 走看看