vue3 store传值

文章介绍了在前端开发中,通过Vuex的状态管理器实现两个没有父子关系的组件之间的数据传递。具体方法是创建store,定义state和mutations,然后在组件中使用commit修改状态,并在另一个组件中通过watch监听并接收数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

做前端开发的时候用到二个没有父子关系的组件之间需要传值,就想到了store传值

store--index.js配置

import { createStore } from 'vuex'
const setStorage = (key, value) => {
  sessionStorage.setItem(key, value);
};

// 本地获取
const getStorage = item => {
  let str = sessionStorage.getItem(item);
  return str;
};

const store = createStore({
  state: {
    menuRouter: '',
  },
  mutations: {
    statechange(state, r) {
      if (state.hasOwnProperty(r.ways)) {
        state[r.ways] = r.data;
        setStorage(r.ways, r.data);
      }
    }
  }
});

页面操作传参(例如点击传参)

<script setup>
  import { useStore } from 'vuex' // 引入useStore 方法
  const store = useStore()

  store.commit("statechange", {
    ways: 'menuRouter',
    data: {
     mark:"1",// 标识字段,如用到多个store传值,不知道传给哪个组件,可给个标识判断一下
     aaa:"xxx",
     bbb:"xxx",//字段可以随便写,几个都行,传你需要的值即可
    }
  })
</script>

另外一个组件接收


<script setup>  
  import { useStore } from 'vuex' // 引入useStore 方法
  const store = useStore()

  const path = reactive({
    value: computed(()=>store.state.menuRouter)
  })
  watch(() => path.value, val => {
    if(val){
      if(val.mark == '1'){// 标识字段判定
        console.log(val.aaa)
        console.log(val.bbb)
      }
    }
  })
</script>

### Vue3 组件之间的方法 在 Vue3 中,组件间的通信可以通过多种方式实现。以下是几种常见的方式: #### 1. 使用 `provide` 和 `inject` 这种方式适用于父级向子级提供数据的情况,也可以用于跨多层嵌套的组件间共享状态。 ```javascript // 父组件 ParentComponent.vue <template> <ChildComponent /> </template> <script setup> import { provide, ref } from &#39;vue&#39;; const message = ref(&#39;Hello from parent&#39;); provide(&#39;message&#39;, message); </script> ``` ```javascript // 子组件 ChildComponent.vue <template> {{ injectedMessage }} </template> <script setup> import { inject } from &#39;vue&#39;; const injectedMessage = inject(&#39;message&#39;); </script> ``` 这种方法不仅限于父子关系,在某些情况下可以替代全局事件总线[^1]。 #### 2. 使用 `$emit` 进行事件触发 对于兄弟组件之间的通讯,通常会通过共同的父组件来协调。其中一个组件发出事件,另一个监听该事件并作出响应。 ```html <!-- 父组件 --> <FatherComponent /> <!-- FatherComponent.vue --> <template> <div> <BrotherA @send-message="handleSendMessage"/> <BrotherB :receivedMessage="receivedMessage"/> </div> </template> <script setup> import BrotherA from &#39;./BrotherA.vue&#39; import BrotherB from &#39;./BrotherB.vue&#39; let receivedMessage = &#39;&#39; function handleSendMessage(message){ receivedMessage = message; } </script> ``` ```html <!-- 发送消息的兄弟组件 A --> <button @click="$emit(&#39;send-message&#39;,&#39;hello&#39;)">Send Message to B</button> ``` ```html <!-- 接收消息的兄弟组件 B --> <p>{{ receivedMessage }}</p> ``` 这种模式清晰明了,易于维护和理解[^2]。 #### 3. 利用 Vuex 或 Pinia 实现集中式管理 当应用程序变得复杂时,推荐采用专门的状态管理模式如Vuex或者Pinia来进行全局状态管理和共享。这能有效减少组件间的耦合度,并提高代码可读性和扩展性。 ```bash npm install pinia --save ``` ```typescript // store/index.ts import { defineStore } from &#39;pinia&#39;; export const useMainStore = defineStore({ id: &#39;main&#39;, state: () => ({ count: 0, }), }); ``` ```javascript // main.js or main.ts import { createApp } from &#39;vue&#39;; import App from &#39;./App.vue&#39;; import { createPinia } from &#39;pinia&#39;; createApp(App).use(createPinia()).mount(&#39;#app&#39;) ``` ```javascript // ComponentA.vue setup() { const store = useMainStore(); function incrementCount(){ store.count++; } return {incrementCount}; } ``` ```javascript // ComponentB.vue setup() { const store = useMainStore(); return {store}; // 可以直接访问count属性 } ``` 上述三种方法各有优劣,开发者可以根据实际项目需求和个人偏好选择最合适的一种或组合使用.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我就是你的语法糖️

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值