从 child.vue 中的挂载向 parent.vue 发出值

Posted

技术标签:

【中文标题】从 child.vue 中的挂载向 parent.vue 发出值【英文标题】:emit value from mounted in child.vue to parent.vue 【发布时间】:2021-11-28 09:55:55 【问题描述】:

我正在与BootstrapVue 合作。

我需要 emit 为我的 parent.vue 赋值 - 但我的代码行 this.$emit('info', this.hide); 不起作用。

如果我console.log(this.hide) 在这种情况下我的值是正确的false,否则如果我的if-statement 是正确的我得到它true

这里有什么错误?

我 child.vue 的脚本:

data()
  return 
    hide: true,
  


mounted() 
  if (statement) 
    if(some statement) 
      //do something
     else 
      this.hide = false;
      console.log(this.hide); //HERE I GET CORRECT VALUE
      this.$emit('info', this.hide); //THIS DOESNT WORK
    
  

它应该如何在我的 parent.vue 中工作:

<template>
  <div @info="info">
    <div> //THIS DIV SHOULD BE SHOWN IF this.hide = false
    </div>
    <div> //THIS DIV SHOULD BE SHOWN IF this.hide = true
    </div>
  </div>
</template>

【问题讨论】:

你在 parent.vue 中有 @info 处理程序吗? 是的.. 我的 parent.vue 中有 @info="info" 更新了我的问题,向您展示我需要做什么.. 你的子组件叫什么名字? 父:App.vue / 子:login.vue 【参考方案1】:

尝试如下 sn-p :

Vue.component('Child', 
  template: `
    <div class="">
      child
      <button @click="changeHide">change hide</button>
    </div>
  `,
  data()
    return 
      hide: true,
    
  ,
  methods: 
    changeHide() 
      this.hide = !this.hide
      this.sendInfo()
    ,
    sendInfo() 
      this.$emit('info', this.hide);
    
  ,
  mounted() 
    //if (statement) 
      //if(some statement) 
        //do something
      // else 
        this.hide = false;
        this.sendInfo()
      //
    
  
)

new Vue(
  el: '#demo',
  data()
    return 
      info: null,
    
  ,
  methods: 
    setInfo(val) 
      this.info = val
    
  
)

Vue.config.productionTip = false
Vue.config.devtools = false
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="demo">
  <div v-if="!info"> //THIS DIV SHOULD BE SHOWN IF this.hide = false
  </div>
  <div v-if="info"> //THIS DIV SHOULD BE SHOWN IF this.hide = true
  </div>
  <p>from child info is:  info </p>
  <Child @info="setInfo" />
</div>

【讨论】:

【参考方案2】:

最好在 App.vue (Parent)

你应该有类似的东西

<login @info="someHandler"></login>

如果您只是用来管理一些逻辑,则无需使用子组件。只有在模板中有一些内容时才合适。 还将发射处理程序放在某些 div 上。这不是发射的工作原理

下面是一个简单的工作示例

App.vue(父级)

<template>

  <h1> title </h1>

  <Child @changeTitle="ChangeT($event)" />

</template>
<script>
import Child from "./components/Child"
export default
name:'App',
components: 
    Child,
,
data()

   return
     title:'Rick Grimes'
         
,
methods:
    ChangeT(title)
    
      this.title=title;
    ,

</script>
<style></style>

Child.vue

<template lang="html">
  <button type="button" @click='passEvent'> Update me</button>
</template>

<script>
export default 
  name:'Child',
  methods:
    passEvent()
    
      this.$emit('changeTitle','Awesome ')
    
  

</script>

<style lang="css" scoped>
</style>

【讨论】:

以上是关于从 child.vue 中的挂载向 parent.vue 发出值的主要内容,如果未能解决你的问题,请参考以下文章

每当在子组件中更新时更新父元素中的数据

Vuejs 道具更新

根据父 vue 中单击事件的索引删除输入

Nuxt.js:理解 <nuxt-child> 组件

Nuxt 嵌套路由

(尚033)Vue_案例_slot(组件间的通信4:slot)