组件通信

Vue.js 教程 · 第 6 章 · 6 次浏览

组件之间传递数据是 Vue 开发的核心问题,方向不同用不同方式。

父传子:props

父组件在子组件标签上写属性,子组件用 props 声明接收。props 是单向的,子组件不能直接改。

子传父:emit

子组件通过 this.$emit("事件名", 数据) 触发事件,父组件用 @事件名 监听。

兄弟/深层:provide/inject 或 Pinia

祖先用 provide 提供数据,后代用 inject 接收,适合深层组件;全局共享状态用 Pinia(Vue 3 官方状态库)。

ref 引用

父组件用 ref 拿到子组件实例,直接调用其方法。

代码示例

<!-- 父组件 -->
<template>
    <Child :msg="parentMsg"
           @reply="handleReply" />
</template>
<script>
import Child from "./Child.vue";
export default {
    components: { Child },
    data() { return { parentMsg: "来自父组件" }; },
    methods: {
        handleReply(data) { console.log("子组件说:", data); }
    }
};
</script>

<!-- 子组件 Child.vue -->
<template>
    <div>
        <p>{{ msg }}</p>
        <button @click="$emit('reply', '收到!')">回复</button>
    </div>
</template>
<script>
export default {
    props: { msg: String },
    emits: ["reply"]
};
</script>
📚 JavaScript 语法速查
常用条目速查,完整版见对应教程章节。可复制代码到在线运行中测试。
写法 / 语法作用
let x = 1;声明变量(可重新赋值)
const y = 2;声明常量(不可重新赋值)
var 已过时旧式变量声明,建议用 let/const
if (条件) { } else { }条件判断
for (let i = 0; i < n; i++) { }循环
while (条件) { }条件循环
function fn(a, b) { return a + b; }函数声明
const fn = (a) => a + 1;箭头函数
array.push(x) / pop()数组尾部添加 / 删除
array.map(fn) / filter(fn)数组映射 / 过滤
obj.key / obj["key"]访问对象属性
JSON.stringify(obj)对象转 JSON 字符串
JSON.parse(str)JSON 字符串转对象
document.getElementById("id")按 id 取元素
document.querySelector("选择器")按选择器取第一个元素
element.textContent读写元素文本
element.innerHTML读写元素 HTML(慎用,防 XSS)
element.addEventListener("click", fn)绑定事件
console.log(x)控制台输出(调试)
setTimeout(fn, 1000)延迟执行(毫秒)
window.location.href当前页面地址(可赋值跳转)
localStorage.setItem("k", v)本地存储写入
localStorage.getItem("k")本地存储读取
new Promise((resolve, reject) => {})Promise 异步处理
async / await异步函数语法糖