javascript Vuej在组件之间共享数据

utugiqy6  于 2023-01-01  发布在  Java
关注(0)|答案(4)|浏览(168)

我有两个部分:

  • App.vue
  • Sidekick.vue

在我的App.vue组件中,我有一个要从Sidekick.vue访问的属性

    • 应用程序版本**
<template>
  <div id="app">
    <p>{{ myData }}</p>
    <div class="sidebar">
      <router-view/> // our sidekick component is shown here
    </div>
  </div>
</template>

<script>
export default {
  name: 'App',
  data () {
    return {
      myData: 'is just this string'
    }
  }
}
</script>
    • 小跟班,你好**
<template>
  <div class="sidekick">
    {{ myData }}
  </div>
</template>

<script>
export default {
  name: 'Sidekick'
}
</script>

我希望从Sidekick.vue访问myData(在App.vue中声明)
我尝试过从Sidekick.vue中导入App.vue,方法如下:

    • Sidekick. vue***(错误尝试)*
<script>
import App from '@/App'
export default {
  name: 'Sidekick',
  data () {
    return {
      myData: App.myData
    }
  }
}
</script>

我读过props-但是只看到子/父组件的引用。在我的例子中,Sidekick.vue显示在App.vue内的div中(不确定这是否使它成为"子")。我需要以某种方式将myData的访问权限授予<router-view/>吗?

    • 更新:(显示App. vue和Sidekick. vue之间的关系**
    • index. js***(路由器文件)*
import Vue from 'vue'
import Router from 'vue-router'
import Sidekick from '@/components/Sidekick',
import FakeComponent from '@/components/FakeComponent'

Vue.use(Router)

const router = new Router({
  routes: [
    {
      path: '/',
      redirect: '/fakecomponent'
    },
    {
      path: '/sidekick',
      name: 'Sidekick',
      component: Sidekick
    },
    {
      path: '/fakecomponent',
      name: 'FakeComponent',
      component: FakeComponent
    }
  ]
})

export default router

当我们点击/sidekick时,Sidekick.vue会被渲染

nkcskrwz

nkcskrwz1#

请记住,经验法则是使用 prop 在单向流中传递数据
prop 放下,活动开始。
https://v2.vuejs.org/v2/guide/components.html#Composing-Components

快速解决方案:

<App/><Sidekick/>组件之间发布消息的全局事件总线。
https://v2.vuejs.org/v2/guide/components.html#Non-Parent-Child-Communication

长期解决方案

使用vuex这样的状态管理库可以更好地将数据封装在一个位置(全局存储),并使用import { mapState, mapMutations } from 'vuex'从组件树中订阅数据

kt06eoxx

kt06eoxx2#

当您进行亲子交流时,最好和推荐的选择是使用 prop 和事件。
当希望在多个组件之间共享状态时,最好和推荐的方法是使用Vuex
如果你想使用简单的数据共享,你可以使用Vue observable。

**简单的例子:**假设您有一个游戏,您希望错误可以被许多组件访问。(组件可以访问它并操作它)。
错误.js

import Vue from "vue";

export const errors = Vue.observable({ count: 0 });

组件1.vue

import { errors } from 'path-of-errors.js'

export default {
  computed: {
    errors () {
      get () { return errors.count },
      set (val) { errors.count = val }
    }
  }
}

Component1中,errors.count是React性的,所以如果作为模板,你有:

<template>
  <div>
    Errors: {{ errors }} 
    <button @click="errors++">Increase</button>
  </div>
</template>

单击 Increase(增加)按钮时,您将看到错误增加。
正如您所料,当您在另一个组件中导入errors.js时,两个组件都可以参与操作errors.count

**注意:**即使您可能使用Vue.observable API进行简单的数据共享,您也应该知道这是一个非常强大的API。例如,请阅读Using Vue Observables as a State Store

nfg76nw0

nfg76nw03#

  • 应用程序版本:*
<router-view pass_data='myData'/>
  • 伙伴价值:*
export default {
  name: "Sidekick",
  props: ["pass_data"],
  created() {
    alert("pass_data: "+this.pass_data)
  }
}
ckx4rj1h

ckx4rj1h4#

如果应用程序js(父级)和Sidekick(子级)
应用程序js

在模板中
在脚本中,从.“/Sidekick.vue导入Sidekick:

助手.vue

属性:[“我的数据”]
现在你可以在sidekick的任何地方访问myData。在模板myData和脚本this.myData中

相关问题