vue中父子传值和兄弟传值

Posted 嘴巴嘟嘟

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vue中父子传值和兄弟传值相关的知识,希望对你有一定的参考价值。

直接上案列,项目结构如下
在这里插入图片描述
路由配置

import Vue from 'vue'
import VueRouter from 'vue-router'
// import Home from '../views/Home.vue'

Vue.use(VueRouter)

const routes = [
  {
    path: '/',
    redirect: '/index'
  },
  {
    path: '/index',
    name: 'Home',
    // route level code-splitting
    // this generates a separate chunk (about.[hash].js) for this route
    // which is lazy-loaded when the route is visited.
    component: () => import(/* webpackChunkName: "Home" */ '../views/Home.vue')
  }
]

const router = new VueRouter({
  routes
})

export default router

在这里插入图片描述

App.vue

<template>
  <div id="app">
    <router-view></router-view>
  </div>
</template>

props是用于数据之间的传递(父组件向子组件),ref也可以用于数据之间的传递(ref用在子组件上,指向的是组件实例,可以理解为对子组件的索引,通过ref可能获取到在子组件里定义的属性和方法。),$emit是用于事件之间的传递(子组件触发父组件里面的方法)

父子传值

props方式

props是用于父组件向子组件传递数据信息(props是单向绑定的,即只能父组件向子组件传递,不能反向。)

Home.vue

<template>
  <div>
    <h1>欢迎来到详情列表</h1>
    <Input @add="addC"></Input>
    <MyList :listArry="list"></MyList>
  </div>
</template>

<script>
import Input from "./Input.vue";
import MyList from "./MyList.vue";
export default {
  name: "Home",
  components: { Input, MyList },
  data() {
    return {
      list: [
        {
          title: "标题1",
        },
        {
          title: "标题2",
        },
        {
          title: "标题3",
        },
      ],
    };
  },

  methods: {
    addC(title) {
      this.list.push({
        title,
      });
    },
  },
};
</script>

<style  scoped>
</style>

MyList.vue

<template>
  <div>
    <ul>
      <li v-for="(item, n) in listArry" :key="n">
        {{ item.title }}
      </li>
    </ul>
  </div>
</template>

<script>
export default {
  name: "MyList",
 // props:["listArry"],//第一种方式
  props:{//第二种方式
    listArry:{
      type:Array,
      default:function(){
        return ""
      }
    }
  },
  data() {
    return {};
  },
};
</script>

<style  scoped>
</style>

Input.vue

<template>
  <div>
    <input type="text" v-model="title" />
    <button @click="addClick">添加</button>
  </div>
</template>

<script>

export default {
  name: "Input",
  data() {
    return {
      title: "",
    };
  },
  methods: {
    addClick() {
      this.$emit("add", this.title);
      this.title = "";
    },
  },
};
</script>

<style  scoped>
</style>

2.通过ref 实现通信
对于ref官方的解释是:ref 是被用来给元素或子组件注册引用信息的。引用信息将会注册在父组件的 refs 对象上。
那应该怎么理解?看看下面的解释:
1.如果ref用在子组件上,指向的是组件实例,可以理解为对子组件的索引,通过ref可能获取到在子组件里定义的属性和方法。
2.如果ref在普通的 DOM 元素上使用,引用指向的就是 DOM 元素,通过$ref可能获取到该DOM 的属性集合,轻松访问到DOM元素,作用与JQ选择器类似。

那如何通过ref 实现通信?下面就将上面prop实现的功能,用ref实现一遍:

 <!-- 父组件 -->
    
    <template>
      <div>
        <h1>我是父组件!</h1>
        <child ref="msg"></child>
      </div>
    </template>
    
    <script>
      import child from '../components/child.vue'
      export default {
        components: {child},
        mounted: function () {
          console.log( this.$refs.msg);
          this.$refs.msg.getMessage('我是子组件一!')
        }
      }
    </script>

    <!-- 子组件 -->
     
    <template>
     <h3>{{message}}</h3>
    </template>
    <script>
     export default {
      data(){
       return{
        message:''
       }
      },
      methods:{
       getMessage(m){
        this.message=m;
       }
      }
     }
    </script>

下面再看一下ref是如何获取dom元素的

<template>
  <div id="app">
    <div ref="testDom">11111</div>
    <button @click="getTest">获取test节点</button>
  </div>
</template>

<script>
export default {
  methods: {
    getTest() {
      console.log(this.$refs.testDom)
    }
  }
};
</script>

在这里插入图片描述

prop和$ref之间的区别:

1.prop 着重于数据的传递,它并不能调用子组件里的属性和方法。像创建文章组件时,自定义标题和内容这样的使用场景,最适合使用prop。
2.ref 着重于索引,主要用来调用子组件里的属性和方法,其实并不擅长数据传递。而且ref用在dom元素的时候,能使到选择器的作用,这个功能比作为索引更常有用到。

兄弟之间传值

创建一个实例js文件

import Vue from 'vue'
const evenBus = new Vue();
export default evenBus

MyList.vue
在这里插入图片描述
Input.vue
在这里插入图片描述

以上是关于vue中父子传值和兄弟传值的主要内容,如果未能解决你的问题,请参考以下文章

VUE父子组件之间的传值,以及兄弟组件之间的传值

Vue-Cli—04.父子组件传值祖孙组件传值兄弟组件传值

vue组件之间的五种传值方法(父子兄弟跨组件)

vue 组件传值,传过来的值不能被渲染,怎么办?

uniapp和vue组件之间的传值方法(父子传值,兄弟传值,跨级传值,vuex)

uniapp和vue组件之间的传值方法(父子传值,兄弟传值,跨级传值,vuex)