React面向组件编程--组件实例的三大核心属性--refs

60 阅读1分钟

1.refs

组件内的标签可以定义ref属性来标识自己

每个标签都可以定义自己的ref属性,然后最后是refs的一个对象包含这些ref

有了ref,就可以不用使用document.getElementById去获取DOM了

目前有两种写ref的方式,一种是回调形式写,一种是createRef方式写

2.回调式

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>title</title>
</head>
<!-- 引入react核心库 -->
<script src="https://cdn.staticfile.org/react/16.5.0/umd/react.development.js"></script>
<!-- 引入react-dom用于支持react操作DOM -->
<script src="https://cdn.staticfile.org/react-dom/16.5.0/umd/react-dom.development.js"></script>
<!-- 引入babel用于ES6转ES5,jsx 转 js -->
<script src="https://cdn.staticfile.org/babel-standalone/6.26.0/babel.min.js"></script>
<script src="https://cdn.staticfile.org/react/16.5.0/umd/react.development.js"></script>
  
<body>
    <!--准备一个容器-->
   <div id="test"></div>
</body>

<!-- 注意这里一定要添加babel,表示这里写的是jsx,用babel翻译为js-->
<script type="text/babel">
    // 创建组件
    class Demo extends React.Component{
       // 展示左侧输入框的数据
       showData = ()=>{
        let {input1} = this;
        console.log(this)
        alert(input1.value)
       }

       showData2 = ()=>{
        let {input2} = this;
        alert(input2.value)
       }

       render(){
        return(
            <div>
                <input ref={currentNode => this.input1 = currentNode} type="text" placeholder="点击按钮提示数据"/>
                <button onClick={this.showData}>按钮</button>
                <input onBlur={this.showData2} ref={currentNode => this.input2 = currentNode} type="text" placeholder="失去焦点提示数据"/>
            </div>
        )
       }
    }
    // 渲染组件到页面
    ReactDOM.render(<Demo a="1"/>,document.getElementById('test'))
</script>
</html>

这种回调式定义ref有一个问题,就是他在组件更新的时候会被调用两次,解决的方法就是把匿名函数改成命名函数

3.createRef方式

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>title</title>
</head>
<!-- 引入react核心库 -->
<script src="https://cdn.staticfile.org/react/16.5.0/umd/react.development.js"></script>
<!-- 引入react-dom用于支持react操作DOM -->
<script src="https://cdn.staticfile.org/react-dom/16.5.0/umd/react-dom.development.js"></script>
<!-- 引入babel用于ES6转ES5,jsx 转 js -->
<script src="https://cdn.staticfile.org/babel-standalone/6.26.0/babel.min.js"></script>
<script src="https://cdn.staticfile.org/react/16.5.0/umd/react.development.js"></script>

<body>
    <!--准备一个容器-->
    <div id="test"></div>
</body>
<!-- 注意这里一定要添加babel,表示这里写的是jsx,用babel翻译为js-->
<script type="text/babel">
    // 创建组件
    class Demo extends React.Component{
       // 创建 ref 对象   React.createRef调用后可以返回一个容器,该容器可以存储被ref所标识的节点
       input1Ref = React.createRef();
       input2Ref = React.createRef();
       // 展示左侧输入框的数据
       showData = ()=>{
        alert(this.input1Ref.current.value);
       }
       showData2 = ()=>{
        alert(this.input2Ref.current.value);
       }
       render(){
        return(
            <div>
                <input ref={this.input1Ref} type="text" placeholder="点击按钮提示数据"/>
                <button onClick={this.showData}>按钮</button>
                <input onBlur={this.showData2} ref={this.input2Ref} type="text" placeholder="失去焦点提示数据"/>
            </div>
        )
       }
    }
    // 渲染组件到页面
    ReactDOM.render(<Demo a="1"/>,document.getElementById('test'));
</script>
</html>
  • 这个需要注意的就是每个容器只可以存储一个ref,会覆盖,所以每个ref都要创建对象