在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/HTML/ 關(guān)于vue2.0vm.$on接收兄弟組件數(shù)據(jù),無法更新data數(shù)據(jù)的問題?

關(guān)于vue2.0vm.$on接收兄弟組件數(shù)據(jù),無法更新data數(shù)據(jù)的問題?

1.問題描述

使用vue2.0框架,webpack打包。有幾個(gè)兄弟組件<v-nav><aboutMe><myExperise><studyExperience>等,其他組件用vm.$emit傳遞dom結(jié)構(gòu),V-nav組件用vm.$on來接收dom的數(shù)據(jù),保存到data中定義的對(duì)象里,在v-nav組件中,在vm.$on里console.log打印,可以得到數(shù)據(jù)。在外部用vm.$nextTick中只能打印aboutMe組件傳來的dom數(shù)據(jù),其他組件打印為空對(duì)象

2.相關(guān)截圖

  • 目錄結(jié)構(gòu)

clipboard.png

  • 父組件的template

<template>
  <div id="app" ref="app">
    <v-header></v-header>
    <v-nav :navScroll="navScroll"></v-nav>
    <aboutMe></aboutMe>
    <myExperise></myExperise>
    <studyExperience></studyExperience>
    <personalInterest></personalInterest>
    <myProjects></myProjects>
  </div>
</template>
  • nav組件中的js

<script type="text/ecmascript-6">
  import bus from '../bus.js'

  export default {
    data () {
      return {
        classMap: ['H0ME', 'ABOUT ME', 'MY EXPERTISE', 'STUDY EXPERIENCE', 'MY PROJECTS'],
        show: true,
        myExperiseHook: {},
        aboutMeHook: {},
        homeHook: {},
        studyExperienceHook: {},
        myProjectsHook: {},
        el: {},
        navScroll: {}
      }
    },
    mounted () {
      if (document.body.clientWidth <= 425) {
        this.show = false
      }
      bus.$on('el3', (msg) => {
        this.aboutMeHook = msg
      })
      bus.$on('el2', function (msg) {
        this.homeHook = msg
      })
      bus.$on('el1', function (msg) {
        this.myExperiseHook = msg
      })
      bus.$on('el4', function (msg) {
        this.studyExperienceHook = msg
      })
      bus.$on('el5', function (msg) {
        this.myProjectsHook = msg
      })
      bus.$on('el6', function (msg) {
        this.el = msg
      })
      bus.$on('el7', function (msg) {
        this.navScroll = msg
      })
      this.$nextTick(() => {
        console.log(this.aboutMeHook)
        console.log(this.studyExperienceHook)
        console.log(this.myExperiseHook)
        console.log(this.navScroll)
      })
    }
  }
</script>
  • aboutMe組件

<template>
  <div class="about-me" ref="aboutMe">
    <div class="content">
      <div class="left-picture"></div>
      <div class="right">
        <div class="title">ABOUT ME</div>
        <span v-for="(item,index) in infoMap" class="info">{{infoMap[index]}}</span>
        <p v-show='show' class="text">{{text}}</p>
      </div>
    </div>
  </div>
</template>

<script type="text/ecmascript-6">
  import bus from '../bus.js'

  export default {
    data () {
      return {
        show: true,
        msg: {}
      }
    },
    mounted () {
      // this.$nextTick(() => {
      this.hideText()
      this.msg = this.$refs.aboutMe
      bus.$emit('el3', this.msg)
      // })
    },
    methods: {
      hideText () {
        if (document.body.clientWidth <= 425) {
          this.show = false
        }
      }
    }
  }
</script>
  • myExperise組件

<template>
  <div class="my-expertise" ref="myExpertise">
    <div class="content">
      <div class="top">
        <h1 class="title-en">MY EXPERTISE</h1>
        <h2 class="title-cn">技能展示</h2>
      </div>
      <div class="main">
        <div v-for="(skill,index) in skills" class="skill">
          <div class="num">{{skills[index].num}}</div>
          <div class="name">{{skills[index].name}}</div>
          <div class="desc">{{skills[index].desc}}</div>
        </div>
      </div>
    </div>
  </div>
</template>

<script type="text/ecmascript-6">
  import bus from '../bus.js'
  export default {
    data () {
      return {
        msg: {}
      }
    },
    mounted () {
      // this.$nextTick(() => {
      this.msg = this.$refs.myExpertise
      bus.$emit('el1', this.msg)
      // })
    }
  }
</script>
  • 控制臺(tái)

在控制臺(tái)中只能打印aboutMe組件的dom,無法打印myExperise組件的dom,其他幾個(gè)組件也和myExperise組件一樣,無法打印

clipboard.png

3. 渴望得到解決

為什么只有aboutMe組件特殊,其他組件就無法打印,哪里有問題
如何修改,可以獲得其他幾個(gè)組件的dom

回答
編輯回答
我甘愿

仔細(xì)看你$on的地方, 只有aboutme是用了箭頭函數(shù).
(我想下面都是廢話, 你已經(jīng)找到問題了)
原因: 箭頭函數(shù)的this指向的是上層作用域, 所以this.aboutme為vm的屬性賦值了. 下面的this指向是當(dāng)前函數(shù).
解決: 1. 把下面的函數(shù)全換成箭頭函數(shù). 2. 前面加let vm = this, 后面函數(shù)里寫vm.xxx = msg.

2018年4月4日 09:35
編輯回答
鹿惑

在父組件中給那些子組件加ref就可以獲取到
比如
<myExperise ref="myExpertise"></myExperise>
獲取 dom: this.$refs.myExpertise.$el
然后再通過prop傳給v-nav

2017年8月8日 15:58