IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> react16:使用ref -> 正文阅读

[移动开发]react16:使用ref

ref是一个字符串

react官网不推荐使用字符串形式的ref,它可能在未来的某个版本被移除。
<input type="text" ref="input1"/>
<input type="text" ref="input2"/>
组件实例的refs属性上以key-value的形式保存着真实DOM元素。
在这里插入图片描述

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>test</title>
    <script src="./js/react.development.js"></script>
    <script src="./js/react-dom.development.js"></script>
    <script src="./js/babel.min.js"></script>
</head>

<body>
    <div id="app"></div>
    <script type="text/babel">
        class Login extends React.Component {

            showData = () => {
                console.log(this);
                alert(this.refs.input1.value);
            }
            showData2 = () => {
                alert(this.refs.input2.value);
            }
            render() {
                return (
                    <div>
                        <div>
                            <input type="text" placeholder="点击按钮提示数据"  ref="input1"/>&nbsp;
                            <button onClick={this.showData}>点我提示数据</button>
                        </div>
                        <input type="text" placeholder="失去焦点提示数据" onBlur={this.showData2} ref="input2" />
                    </div>
                )
            }
        }

        ReactDOM.render(<Login />, document.getElementById("app"));
    </script>
</body>

</html>

在这里插入图片描述

ref是一个回调函数

回调函数是内联形式

<input type="text" ref={c => this.input1 = c}/>
<input type="text" ref={c => this.input2 = c} />
回调函数的参数,就是真实的DOM元素。
在这里插入图片描述

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>test</title>
    <script src="./js/react.development.js"></script>
    <script src="./js/react-dom.development.js"></script>
    <script src="./js/babel.min.js"></script>
</head>

<body>
    <div id="app"></div>
    <script type="text/babel">
        class Login extends React.Component {

            showData = () => {
                console.log(this.input1);
                alert(this.input1.value);
            }
            showData2 = () => {
                console.log(this.input2);
                alert(this.input2.value);
            }
            render() {
                return (
                    <div>
                        <div>
                            <input type="text" placeholder="点击按钮提示数据"  ref={c => this.input1 = c}/>&nbsp;
                            <button onClick={this.showData}>点我提示数据</button>
                        </div>
                        <input type="text" placeholder="失去焦点提示数据" onBlur={this.showData2} ref={c => this.input2 = c} />
                    </div>
                )
            }
        }

        ReactDOM.render(<Login />, document.getElementById("app"));
    </script>
</body>

</html>

在这里插入图片描述
回调函数是内联函数时,组件更新过程会执行两次回调。回调第一次执行,返回null;回调第二次执行,返回真实DOM元素。这是因为每次渲染时都会创建新的函数实例,react会清除旧的ref并设置新的。如下。

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>test</title>
    <script src="./js/react.development.js"></script>
    <script src="./js/react-dom.development.js"></script>
    <script src="./js/babel.min.js"></script>
</head>

<body>
    <div id="app"></div>
    <script type="text/babel">
        class Login extends React.Component {
            state = {
                isHot:false
            }
            changeWeather = () => {
                const {isHot} = this.state;
                this.setState({
                    isHot:!isHot
                })
            }
            showData = () => {
                console.log(this.input1);
                alert(this.input1.value);
            }
            showData2 = () => {
                console.log(this.input2);
                alert(this.input2.value);
            }
            render() {
                const {isHot} = this.state;
                const {changeWeather,showData,showData2} = this;
                return (
                    <div>
                        <h2 onClick={changeWeather}>今天天气很{isHot ? "炎热" : "凉爽"}</h2>
                        <div>
                            <input type="text" placeholder="点击按钮提示数据"  ref={c => {this.input1 = c;console.log("@",c)}}/>&nbsp;
                            <button onClick={showData}>点我提示数据</button>
                        </div>
                        <input type="text" placeholder="失去焦点提示数据" onBlur={showData2} ref={c => this.input2 = c} />
                    </div>
                )
            }
        }

        ReactDOM.render(<Login />, document.getElementById("app"));
    </script>
</body>

</html>

在这里插入图片描述
react官网说,虽然更新过程中,内联形式的回调函数会执行两次,但大多数情况下无关紧要。

回调函数绑定在类实例上

<input type="text" ref={saveInput1}/>
<input type="text" ref={saveInput2} />

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>test</title>
    <script src="./js/react.development.js"></script>
    <script src="./js/react-dom.development.js"></script>
    <script src="./js/babel.min.js"></script>
</head>

<body>
    <div id="app"></div>
    <script type="text/babel">
        class Login extends React.Component {
            state = {
                isHot:false
            }
            changeWeather = () => {
                const {isHot} = this.state;
                this.setState({
                    isHot:!isHot
                })
            }
            saveInput1 = (c) => {
                this.input1 = c;
                console.log("@",c);
            }
            saveInput2 = (c) => {
                this.input2 = c;
            }
            showData = () => {
                console.log(this.input1);
                alert(this.input1.value);
            }
            showData2 = () => {
                console.log(this.input2);
                alert(this.input2.value);
            }
            render() {
                const {isHot} = this.state;
                const {changeWeather,showData,showData2,saveInput1,saveInput2} = this;
                return (
                    <div>
                        <h2 onClick={changeWeather}>今天天气很{isHot ? "炎热" : "凉爽"}</h2>
                        <div>
                            <input type="text" placeholder="点击按钮提示数据"  ref={saveInput1}/>&nbsp;
                            <button onClick={showData}>点我提示数据</button>
                        </div>
                        <input type="text" placeholder="失去焦点提示数据" onBlur={showData2} ref={saveInput2} />
                    </div>
                )
            }
        }

        ReactDOM.render(<Login />, document.getElementById("app"));
    </script>
</body>

</html>

在这里插入图片描述

createRef

  1. myRef = React.createRef()createRef()将返回一个容器,用于保存ref标识的节点。
  2. <input type="text" ref={myRef}/>ref属性标识目标元素。
  3. this.myRef.current,访问目标元素。
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>test</title>
    <script src="./js/react.development.js"></script>
    <script src="./js/react-dom.development.js"></script>
    <script src="./js/babel.min.js"></script>
</head>

<body>
    <div id="app"></div>
    <script type="text/babel">
        class Login extends React.Component {

            myRef = React.createRef();
            myRef2 = React.createRef();
            showData = () => {
                console.log(this.myRef);
                alert(this.myRef.current.value);
            }
            showData2 = () => {
                console.log(this.myRef2);
                alert(this.myRef2.current.value);
            }
            render() {
                const {showData,showData2,myRef,myRef2} = this;
                return (
                    <div>
                        <div>
                            <input type="text" placeholder="点击按钮提示数据"  ref={myRef}/>&nbsp;
                            <button onClick={showData}>点我提示数据</button>
                        </div>
                        <input type="text" placeholder="失去焦点提示数据" onBlur={showData2} ref={myRef2} />
                    </div>
                )
            }
        }

        ReactDOM.render(<Login />, document.getElementById("app"));
    </script>
</body>

</html>

在这里插入图片描述

不要过度使用ref

不要过度使用ref。比如,上述例子里,第二个input就没必要用ref,在事件回调中使用event.target即可获取输入框的文本值。

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>test</title>
    <script src="./js/react.development.js"></script>
    <script src="./js/react-dom.development.js"></script>
    <script src="./js/babel.min.js"></script>
</head>

<body>
    <div id="app"></div>
    <script type="text/babel">
        class Login extends React.Component {

            myRef = React.createRef();
            showData = () => {
                alert(this.myRef.current.value);
            }
            showData2 = (event) => {
                alert(event.target.value);
            }
            render() {
                const {showData,showData2,myRef,myRef2} = this;
                return (
                    <div>
                        <div>
                            <input type="text" placeholder="点击按钮提示数据"  ref={myRef}/>&nbsp;
                            <button onClick={showData}>点我提示数据</button>
                        </div>
                        <input type="text" placeholder="失去焦点提示数据" onBlur={showData2}/>
                    </div>
                )
            }
        }

        ReactDOM.render(<Login />, document.getElementById("app"));
    </script>
</body>

</html>

在这里插入图片描述

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-04-09 18:32:44  更:2022-04-09 18:35:35 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 20:31:47-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码