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 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> 第二十四篇 ref 访问子组件 -> 正文阅读

[JavaScript知识库]第二十四篇 ref 访问子组件

? ? ? ?组件的引入和使用,以及父传子props、子传父$emit所对应的场景有了了解之后,回顾讲到的内容进行这样的一个比喻:

????????父传子通过属性,子传父通过事件,尽管有了 props 和 事件,有的时候你仍可能需要在 javascript 里直接访问一个子组件。通过 ref 方法 可以直接访问子组件的实例或子元素;下面通过一张简单的图来了解一下:

????????那么父子通信的方式应该是父传子props属性,子传父事件$emit,如果还有才是ref,ref 是需要慎用的,上图也讲到了使用 ref 是一种"偷取"孩子信息以及修改的方式,是一种不恰当的行为方式,会导致直接去修改子组件当中的状态,后续出现问题就不能够清楚知道是子组件自己本身影响导致的问题还是由于父组件去修改了子组件当中的信息导致的问题,无法监控而做出判断。

? ? ? ? 如果以上不能理解没关系,通过下面代码来使用继续了解,先来讲一下 ref 的使用:

ref 使用

? ? ? ? 在讲 v-mode l指令当中我们有个一个案例,即获取input框当中的数据,当时用了通过监听input框中的数据进而获取;再者讲到 v-model 的双向绑定,可以直接拿到input框中的数据;那么这跟 ref 有什么关系?

ref 绑定在标签上可以拿到原生节点

下面来编写代码和演示效果:

<div id="app">
    <input type="text" ref="mytext"/>
    <input type="submit" @click="handleClick"/>
</div>
<script>
    new Vue({
        el:'#app',
        data:{},
        methods:{
            handleClick(){
                console.log(this.$refs)
                console.log(this.$refs.mytext);
                console.log(this.$refs.mytext.value);
            }
        }
    })
</script>

? ? ? ? 在标签上绑定 ref 我们可以获取到它的原生DOM节点,获取到它的原始DOM节点可以干嘛,可以来操作DOM节点,但是不建议去直接的来操作DOM节点;以上是通过 ref 可以获取到input框数据的一个另类方法,不仅可以放置在input,在任何标签上绑定ref,都可以拿到原始DOM节点;

<div ref="mydiv">ref</div>
// this.$refs.mydiv        

?ref 绑定在标签上可以获取到原始DOM节点,那么绑定到组件上呢?

ref 绑定在组件上可以获取组件对象 -- 组件通信

?下面来编写代码和演示效果:

<div id="app">
    <child ref="mychild"></child>
    <button @click="handleClick">获取</button>
</div>
<script>
    Vue.component("child",{
        template:`
            <div>
                child组件
            </div>
        `
    })
    new Vue({
        el:'#app',
        data:{},
        methods:{
            handleClick(){
                console.log(this.$refs) 
            }
        }
    })
</script>

? ? ? ? ?拿到组件对象有什么用?里面不就有组件的一些状态和方法;那么前面我们在讲父传子和子传父用到下面这张图:

? ? ? ? ?下面针对 ref 来个图,可以进行一个对比;

? ? ? ? 通过图片内容可以知道,父传子和子传父的方式是不需要担心会对原始数据进行修改后无迹可寻,而使用 ref 可以很粗暴的就直接拿到子组件当中的数据,甚至可以进行修改子组件中的数据,一旦多个组件同时使用则会很难知道到底时谁修改了子组件中的数据,不仅是要检查子组件还有检查父组件;

<div id="app">
    <child ref="mychild"></child>
    <button @click="handleClick">获取</button>
</div>
<script>
    Vue.component("child",{
        template:`
            <div>
                <p>孩子有{{money}}块</p>
            </div>
        `,
        data(){
            return{
                money:1000
            }
        }
    })
    new Vue({
        el:'#app',
        data:{},
        methods:{
            handleClick(){
                console.log("我能直接拿到:",this.$refs.mychild.money);
                console.log("我给花了800块");
                this.$refs.mychild.money = 200; 
            }
        }
    })
</script>

? ? ? ? 通过以上对 ref 的讲解大致知道了使用 ref 绑定在组件上可以直接获取子组件对象,不用经过子组件的同意可以直接拿到子组件中的状态和方法并加以去修改;如果mychild又在其他组件当中去使用,一整改出问题,就不清楚问题出在哪里,使用父传子还是子传父,数据状态出现问题了只需要去检查子组件当中的问题即可,不需要去检查父组件是否去操作修改了我的数据,这样一来使用 ref 去直接操作子组件当中的一些东西是不够妥当的!那么到这里我们就讲了有关于组件通信当中 ref 方法的使用和使用 ref 能做什么和带来什么问题!?

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-11-05 00:19:49  更:2022-11-05 00:20:08 
 
开发: 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年5日历 -2024/5/17 18:27:27-

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