vue.js - 在子组件之间传递数据

标签 vue.js vuejs2 vue-component

我正在努力让它发挥作用。我需要从 FormComponent 访问 ChooseLangComponent 中的 selected 值。有什么直接的方法可以做到这一点,或者我们必须从父组件传递它(充当中间人)?我已经尝试在 ChooseLangComponent 上使用 $emit 和在 FormComponent 上使用 v-on:.. 但没有成功。

选择语言组件:

<template lang="html">
    <div class="choose-lang">
        <select v-model="selected">
            <option v-for="lang in langs" v-bind:value="lang.value">{{lang.text}}</option>
        </select>
    </div>
</template>

<script>
    export default {
        data() {
            return {
                selected: 'en',
                langs: [
                    { text: 'English', value: 'en' },
                    { text: 'German', value: 'ge' },
                ]
            }
        }
    }
</script>

表单组件:

<template lang="html">
    <div class="form-name">
        <div class="inputs">
            <input type="text" v-model="nameText" v-on:keyup.enter="send_name">
        </div>
    </div>
</template>

export default {
    data() {
        return {
            nameText: '',
        }
    },
    methods: {
        send_name() {
              // I need the selected language here
        }
    }
}

父组件:

<div id="app">
    <choose-lang></choose-lang>
    ...
    <form-comp></form-comp>
</div>

...
Vue.component('choose-lang', require('./components/ChooseLangComponent.vue'));
Vue.component('form-comp', require('./components/FormComponent.vue'));

const app = new Vue({
el: '#app',
data: {
    ...
});

最佳答案

好吧,有 2 种简单的方法,如果您的应用程序规模很大,还有一种涉及 Vuex。

第一种方法是创建事件总线 - 想法是在一个集线器中发出事件,然后在需要的地方捕获它们。

const Bus = new Vue({})

Vue.component('lang', {
       template: '#lang-tmp', 
       data() {
            return {
                selected: 'en',
                langs: [
                    { text: 'English', value: 'en' },
                    { text: 'German', value: 'ge' },
                ]
            }
        },
        created() {
          this.changeLang()
        },
        methods: {
          changeLang() {
            Bus.$emit('langChanged', this.selected)
          }
        }
})

Vue.component('frm', {
  template: '#frm-tmp',
  data() {
    return {
      selectedItem: 'en'
    }
  },
  created() {
    Bus.$on('langChanged', (selected) => {
      this.selectedItem = selected
    })
  }
})

const app = new Vue({

  el: '#app'

})

http://jsbin.com/siyipuboki/edit?html,js,output

第二种方法是创建一种存储 - 保存所选项目状态的普通对象

const store = {
  data: {
    selected: null
  }
}

Vue.component('lang', {
       template: '#lang-tmp', 
       data() {
            return {
                selected: 'en',
                langs: [
                    { text: 'English', value: 'en' },
                    { text: 'German', value: 'ge' },
                ]
            }
        },
        created() {
          this.changeLang()
        },
        methods: {
          changeLang() {
            store.data.selected = this.selected
          }
        }
})

Vue.component('frm', {
  template: '#frm-tmp',
  data() {
    return {
      storeSelected: store.data
    }
  }
})

const app = new Vue({

  el: '#app'

})

http://jsbin.com/qagahabile/edit?html,js,output

另请检查此 VueJS access child component's data from parent

关于vue.js - 在子组件之间传递数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43155274/

相关文章:

javascript - Vue 转换不适用于具有可重用组件的路由器 View

webpack - 将 JSON 导入 VueJS

javascript - vue.js、vue-router 和参数/属性

css - <v-time-picker> - 时间选择器不工作

vue.js - 使用 Vue Router 加载组件

node.js - 在 Vue.js 中找不到这些依赖项错误

javascript - Web 扩展中的共享 vuex 状态(死对象问题)

vue.js - Vue 包装示例

javascript - ASP.NET MVC - 将包含数组的 FormData 映射到模型类

javascript - 在 Vue 中渲染只读内容的最佳方法