Vuejs 在组件之间共享数据

新手上路,请多包涵

我有两个组成部分:

  • App.vue
  • Sidekick.vue

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

App.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>

Sidekick.vue

 <template>
  <div class="sidekick">
    {{ myData }}
  </div>
</template>

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

我想从 Sidekick.vue 访问 myData (在 App.vue 中声明)

我尝试从 --- 中导入 App.vue Sidekick.vue 通过执行以下操作:

Sidekick.vue (错误尝试)

 <script>
import App from '@/App'
export default {
  name: 'Sidekick',
  data () {
    return {
      myData: App.myData
    }
  }
}
</script>

我已经阅读了有关道具的信息 - 但只看到了对子/父组件的引用。在我的例子中, Sidekick.vue 显示在 --- 的一个 div App.vue (不确定这是否使它成为“孩子”)。我是否需要以某种方式授予 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.vue 当我们点击 /sidekick

原文由 bruh 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 367
2 个回答

请记住,经验法则是使用 props 以单向流的方式传递数据

道具向下,事件向上。

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' 从你的组件树订阅它

原文由 lxyyz 发布,翻译遵循 CC BY-SA 4.0 许可协议

当您进行亲子交流时,最好和推荐的选择是使用道具和事件。 在 Vue 文档中阅读更多内容


当想要在许多组件之间共享状态时,最好和推荐的方法是使用 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 }
    }
  }
}

Component1errors.count 是反应性的。因此,如果作为模板,您有:

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

单击“ _增加_”按钮时,您会看到错误在增加。


正如您所料,当您在另一个组件中导入 errors.js 时,这两个组件都可以参与操作 errors.count


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

原文由 Roland 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏