Vue.js 从另一个组件中的一个Vue单个组件获取数据?

Vue.js 从另一个组件中的一个Vue单个组件获取数据?,vue.js,vuejs2,vue-component,Vue.js,Vuejs2,Vue Component,我使用Vue.js 2.5.13并具有以下结构: 组件一.vue: 从“component two.vue”导入component two 导出默认值{ 名称:“第一部分”, 组成部分:{ 成分二 }, 数据(){ 返回{ 输入_one:“来自ComponentOne的您好”, 输入二:…/您可以使用全局事件总线轻松实现这一点 对于更大、更复杂的应用程序,我建议使用vuex等状态管理工具 您可以使用 从“component two.vue”导入component two 导出默认值{ 名称

我使用
Vue.js 2.5.13
并具有以下结构:

组件一.vue


从“component two.vue”导入component two
导出默认值{
名称:“第一部分”,
组成部分:{
成分二
},
数据(){
返回{
输入_one:“来自ComponentOne的您好”,

输入二:…/您可以使用全局事件总线轻松实现这一点

对于更大、更复杂的应用程序,我建议使用vuex等状态管理工具

您可以使用


从“component two.vue”导入component two
导出默认值{
名称:“第一部分”,
组成部分:{
成分二
},
数据(){
返回{
输入_one:“来自ComponentOne的您好”,
输入两个:“”
}
}
}
组件2.vue:

<template>
  <div>
    <input type="text" v-model="input_two">
  </div>
</template>

<script>
  export default {
    name: "component-two",
    data() {
      return {
        input_one: 'Hello from ComponentTwo',
        input_two: ''
      },
      watch: {
        input_two : function(val){
          this.$emit('update:secondValue', val)
        }
      }
    }
  }
</script>

导出默认值{
名称:“第二部分”,
数据(){
返回{
输入一:“来自组件二的您好”,
输入两个:“”
},
观察:{
输入二:功能(val){
此.$emit('update:secondValue',val)
}
}
}
}

您需要实现一个将v型模型发送回父级的系统

这可以通过使用组件2中的computed属性来完成,该属性在其set方法中发出更改

例如:

Vue.component('component-two'{
名称:‘组件二’,
模板:“#组件二模板”,
道具:{
价值:{
要求:正确,
类型:字符串,
},
},
计算:{
信息:{
得到(){
返回此.value;
},
设置(val){
此.$emit('input',val);
},
},
},
});
var app=新的Vue({
el:“#应用程序”,
数据:{
信息1:‘m1’,
信息2:‘m2’,
},
});

输出

{{message1}} {{message2}}
Vuejs使用“道具”进行父/子通信,使用“发射”事件进行子/父通信

您必须记住,对于传递给子组件的每个道具,您都应该将该道具传递给道具数组。这同样适用于事件,您发出的每个事件都应该在父组件中捕获,因此:

组件一。vue:


从“component two.vue”导入component two
导出默认值{
名称:“第一部分”,
组成部分:{
成分二
},
数据(){
返回{
输入_one:“来自ComponentOne的您好”,
输入两个:“”
}
},
方法:{
doSomenthing(数据){
此参数输入_two=数据;
}
}
}
组件二。vue:



有几种方法可以做到这一点,其他答案中也提到了一些方法:
无特定顺序,有关更多信息,请阅读下面的详细章节)

  • 使用
  • 使用
  • 使用
  • 使用
  • 使用
  • 对于双向绑定,请记住它可能导致难以维持的突变链, 引自文件:

    不幸的是,真正的双向绑定可能会产生维护问题,因为子组件可以变异父组件,而父组件和子组件中的变异源都不明显

    以下是可用方法的一些详细信息:

    1.)使用全局事件总线

    我强烈建议不要将此方法用于组件之间的任何类型的公共通信,正如在许多地方(如

    2.)在组件上使用道具

    道具易于使用,是解决大多数常见问题的理想方法。
    因为所有属性都需要在对象上可用,否则它们将不会是反应性的。 如果在Vue完成使其可观察后添加任何属性,则必须使用这些属性

    //正常使用
    Vue.set(可变,'aNewProp',42);
    //这是如何在Nuxt中使用它
    此.$set(this.historyEntry,'date',new date());
    
    对于组件和父对象,对象都是被动的:

    如果你将一个对象/数组作为道具传递,它将自动进行双向同步-在 子级,则在父级中更改

    如果传递简单值(字符串、数字) 通过道具,您必须明确使用

    引自-->

    3.)使用v型属性

    v-model属性是一种语法糖,可以在父级和子级之间实现简单的双向绑定。它的作用与sync修饰符的作用相同,只是它使用特定的属性和特定的事件进行绑定

    这:

    
    
    与此相同:

    
    
    其中,道具必须是,事件必须是输入

    4.)使用同步修改器

    sync修饰符也是语法糖,其作用与v-model相同,只是道具和事件名称由正在使用的任何东西设置

    在父级中,它可以按如下方式使用:

    
    
    可以从子级发出事件,通知父级任何更改:

    this.$emit('update:title',newTitle)
    
    5.)使用Vuex

    Vuex是一种数据存储,可从每个组件访问。 可以订阅更改

    通过使用Vuex存储,可以更容易地查看数据变化流,并显式定义它们。通过使用,可以轻松调试和回滚所做的更改

    这种方法需要更多的样板,但如果在整个项目中使用,它将成为一种更干净的方法
    <template>
      <div>
        <input type="text" v-model="input_two">
      </div>
    </template>
    
    <script>
      export default {
        name: "component-two",
        data() {
          return {
            input_one: 'Hello from ComponentTwo',
            input_two: ''
          },
          watch: {
            input_two : function(val){
              this.$emit('update:secondValue', val)
            }
          }
        }
      }
    </script>