当前位置: 首页 > article >正文

vue基础(八)

在 Vue 中,组件之间的传值方式主要包括以下几种情况:

1. 父组件向子组件传值(props

父组件通过 props 传递数据给子组件:

<!-- Parent.vue -->
<template>
  <ChildComponent :msg="message" />
</template>

<script>
import ChildComponent from './ChildComponent.vue';
export default {
  components: { ChildComponent },
  data() {
    return {
      message: 'Hello from Parent!'
    };
  }
};
</script>
<!-- ChildComponent.vue -->
<template>
  <p>Received message: {{ msg }}</p>
</template>

<script>
export default {
  props: {
    msg: String
  }
};
</script>

2. 子组件向父组件传值($emit

子组件通过 this.$emit 触发事件,父组件监听事件并获取值:

<!-- Parent.vue -->
<template>
  <ChildComponent @update-message="handleMessage" />
  <p>Message from Child: {{ receivedMessage }}</p>
</template>

<script>
import ChildComponent from './ChildComponent.vue';
export default {
  components: { ChildComponent },
  data() {
    return {
      receivedMessage: ''
    };
  },
  methods: {
    handleMessage(msg) {
      this.receivedMessage = msg;
    }
  }
};
</script>
<!-- ChildComponent.vue -->
<template>
  <button @click="sendMessage">Send to Parent</button>
</template>

<script>
export default {
  methods: {
    sendMessage() {
      this.$emit('update-message', 'Hello from Child!');
    }
  }
};
</script>

3. 兄弟组件传值(Event BusPinia/Vuex

兄弟组件需要一个中间桥梁,比如 Event Bus(Vue 3 不推荐)或 Pinia(推荐):

// eventBus.js (Vue 2 可用,Vue 3 推荐使用 Pinia)
import Vue from 'vue';
export const EventBus = new Vue();

BrotherA.vue 发送数据:

<template>
  <button @click="sendMessage">Send to BrotherB</button>
</template>

<script>
import { EventBus } from './eventBus.js';
export default {
  methods: {
    sendMessage() {
      EventBus.$emit('message', 'Hello from BrotherA!');
    }
  }
};
</script>

BrotherB.vue 接收数据:

<template>
  <p>{{ receivedMessage }}</p>
</template>

<script>
import { EventBus } from './eventBus.js';
export default {
  data() {
    return { receivedMessage: '' };
  },
  created() {
    EventBus.$on('message', msg => {
      this.receivedMessage = msg;
    });
  }
};
</script>

4. ref 方式(获取子组件实例)

父组件可以通过 ref 获取子组件实例并访问其方法或数据:

<!-- Parent.vue -->
<template>
  <ChildComponent ref="childRef" />
  <button @click="callChildMethod">Call Child Method</button>
</template>

<script>
import ChildComponent from './ChildComponent.vue';
export default {
  components: { ChildComponent },
  methods: {
    callChildMethod() {
      this.$refs.childRef.childMethod();
    }
  }
};
</script>
<!-- ChildComponent.vue -->
<template>
  <p>Child Component</p>
</template>

<script>
export default {
  methods: {
    childMethod() {
      console.log('Child method called!');
    }
  }
};
</script>

5. provideinject(适用于祖孙组件)

适用于跨层级组件通信:

<!-- GrandParent.vue -->
<template>
  <Parent />
</template>

<script>
import Parent from './Parent.vue';
export default {
  components: { Parent },
  provide() {
    return { sharedMessage: 'Hello from GrandParent!' };
  }
};
</script>
<!-- Parent.vue -->
<template>
  <Child />
</template>

<script>
import Child from './Child.vue';
export default {
  components: { Child }
};
</script>
<!-- Child.vue -->
<template>
  <p>{{ sharedMessage }}</p>
</template>

<script>
export default {
  inject: ['sharedMessage']
};
</script>

6. Vuex 或 Pinia(全局状态管理)

适用于复杂状态管理,如 Vuex(Vue 2)或 Pinia(Vue 3):

// store.js (使用 Pinia)
import { defineStore } from 'pinia';

export const useMainStore = defineStore('main', {
  state: () => ({
    message: 'Hello from Store'
  }),
  actions: {
    setMessage(newMsg) {
      this.message = newMsg;
    }
  }
});

ComponentA.vue 更新数据:

<template>
  <button @click="updateMessage">Update Message</button>
</template>

<script>
import { useMainStore } from './store.js';
export default {
  setup() {
    const store = useMainStore();
    const updateMessage = () => store.setMessage('Updated Message!');
    return { updateMessage };
  }
};
</script>

ComponentB.vue 读取数据:

<template>
  <p>{{ store.message }}</p>
</template>

<script>
import { useMainStore } from './store.js';
export default {
  setup() {
    const store = useMainStore();
    return { store };
  }
};
</script>


http://www.kler.cn/a/543870.html

相关文章:

  • 鸿蒙HarmonyOS NEXT开发:优化用户界面性能——组件复用(@Reusable装饰器)
  • 【Redis】 - Redis的Bitmap实现用户签到
  • windows系统远程桌面连接ubuntu18.04
  • k8s管理工具之lens
  • RK3588视觉控制器与AI 算法:开启工业视觉检测新境界
  • 读书笔记分享
  • arkTS基础
  • 人工智能:所有144本SCI期刊都在这里(20本Top,4本On Hold)
  • JavaScript设计模式 -- 适配器模式
  • 《手札·行业篇》开源Odoo MES系统与SKF Observer Phoenix API双向对接方案
  • Notepad++ 中删除所有以 “pdf“ 结尾的行
  • CSS 核心技术知识点详解:从基础到进阶
  • 应用层优秀的共享民宿物联网框架该怎么选?
  • Kotlin 2.1.0 入门教程(十四)类、构造函数、对象、抽象类
  • mysql BUG 导致 show processlist 有大量的show slave stauts 处于init状态
  • Java调用C++动态库、入参为对象
  • websocketpp库使用:快速搭建一个websocket服务端
  • 【学习】如何高效通过CCRC信息安全服务资质认证
  • 介绍下SpringBoot在分布式架构中,如何实现读写分离
  • 晶闸管主要参数分析与损耗计算
  • 【Web安全测试】Burp中NEW_xp_CAPTCHA插件(含4.1和4.2)的下载安装和导入
  • 网络安全设备异构要求 网络安全设备硬件
  • 伺服报警的含义
  • PostgreSQL插件-pg_stat_statements-安装和使用
  • Unity-Mirror网络框架-从入门到精通之Multiple Additive Scenes示例
  • .NET Core中使用HttpClient模拟form-data格式数据提交