• vuejs之父子组件访问【$refs】【$children】


    在Vue中,我们不用依赖原生JS或jQuery等第三方库获取DOM节点,据官方所示,元素绑定ref后,父组件可以直接通过调用this.$refs即可得到整个目标对象,提高了获取DOM节点的效率。

    父组件访问子组件

    $refs 

    $refs(reference 缩略):一个持有注册过ref attribute 的所有 DOM 元素和组件实例。本质是一个对象。如果在普通的 DOM 元素上使用,引用指向的就是 DOM 元素;如果用在子组件上,引用就指向该子组件实例。通俗讲,refs特性就是为元素或子组件赋予一个class/id引用,通过this.$refs.refName来访问元素或子组件的实例。

     代码示例:

    1. <div id="app">
    2. <cpn>cpn>
    3. <cpn>cpn>
    4. <cpn ref="aaa">cpn>
    5. <button @click="btnClick" >按钮button>
    6. div>
    7. <template id="cpn">
    8. <div>
    9. 我是子组件
    10. div>
    11. template>
    12. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js">script>
    13. <script>
    14. // 父传子:props
    15. const cpn = {
    16. template: "#cpn",
    17. data() {
    18. return {
    19. name:"我是子组件的name"
    20. }
    21. },
    22. methods: {
    23. },
    24. };
    25. const app = new Vue({
    26. el: "#app",
    27. data() {
    28. },
    29. methods: {
    30. btnClick(){
    31. // 使用 $ref
    32. console.log(this.$refs);
    33. console.log(this.$refs.aaa.name)
    34. }
    35. },
    36. components: {
    37. cpn
    38. },
    39. })
    40. script>

    输出结果:

     this.$refs是一个对象类型,默认是个空对象({}),叫做VueComponent,并伴有标识符aaa。展开后可操作其挂载的数据和调用上面的方法。

    另外当ref和v-for一起使用时,获得的引用将会是一个数组,包含循环数组源:

    1. <script>
    2. export default {
    3. data() {
    4. return {
    5. arr: ['one', 'two', 'three', 'four']
    6. }
    7. },
    8. mounted() {
    9. console.log(this.$refs.myDiv)
    10. }
    11. }
    12. script>

    输出结果:

      

    注: $refs 只会在组件渲染完成之后生效,并且它们不是响应式的。这仅作为一个用于直接操作子组件的“逃生舱”——你应该避免在模板或计算属性中访问 $refs

    $children

    代码示例: 

    1. <div id="app">
    2. <cpn>cpn>
    3. <cpn>cpn>
    4. <cpn>cpn>
    5. <button @click="btnClick" >按钮button>
    6. div>
    7. <template id="cpn">
    8. <div>
    9. 我是子组件
    10. div>
    11. template>
    12. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js">script>
    13. <script>
    14. // 父传子:props
    15. const cpn = {
    16. template: "#cpn",
    17. data() {
    18. },
    19. methods: {
    20. showMessage(){
    21. console.log("showMessage");
    22. }
    23. },
    24. };
    25. const app = new Vue({
    26. el: "#app",
    27. data() {
    28. },
    29. methods: {
    30. btnClick(){
    31. // 使用 $children
    32. console.log(this.$children)
    33. console.log(this.$children[0].showMessage)
    34. for (let cpn of this.$children) {
    35. console.log(cpn.showMessage)
    36. }
    37. }
    38. },
    39. components: {
    40. cpn
    41. },
    42. })
    43. script>

    输出结果:

     

    可见 this.$children 获取的是数组类型,也是叫VueComponent,展开后可以对其内部数据和方法进行调用。

    缺点: 需要手动传入索引指定子组件,较繁琐,开发不常用。

      

     参考:https://blog.csdn.net/qq_38128179/article/details/88876060        https://v2.cn.vuejs.org/v2/guide/components-edge-cases.html#%E8%AE%BF%E9%97%AE%E5%AD%90%E7%BB%84%E4%BB%B6%E5%AE%9E%E4%BE%8B%E6%88%96%E5%AD%90%E5%85%83%E7%B4%A0

     

     

  • 相关阅读:
    【已解决】 E45: ‘readonly‘ option is set (add ! to override)
    Allegro批量剪断走线操作
    【C语言】32个关键字
    Nginx基础篇-Nginx的WEB模块~连接状态
    vue3+vite+ts打包时遇到的问题以及“优化”,JavaScript heap out of memory(错误:内存不足)等
    Unity fbx动画压缩自动化
    flutter ble插件
    SwiftUI Swift内功之Swift 5.8 适合Early Adopters
    【YOLO】语义分割和实例分割(四)
    Seata源码研读#01-详解配置管理机制
  • 原文地址:https://blog.csdn.net/weixin_45719444/article/details/126290132