一、开篇:一个让新手抓狂的“数据失踪案”
记得我刚学Vue时,写过这样的“智障”代码:
<!-- 子组件 Child.vue -->
<template>
<div class="child">
<h3>我是子组件</h3>
<slot></slot>
</div>
</template>
<script>
export default {
data() {
return {
childMessage: '来自孩子的悄悄话'
}
}
}
</script>
<!-- 父组件 Parent.vue -->
<template>
<Child>
<!-- 天真地以为能直接拿到子组件数据 -->
<p>{
{ childMessage }}</p> <!-- 结果:空白! -->
</Child>
</template>
然后...页面一片空白!我盯着控制台反复检查:“childMessage明明定义了呀?!”
直到我理解了编译作用域这个概念,才恍然大悟——原来Vue的插槽机制里,藏着这样一个“固执”的规则:
“插槽内容在哪里定义,就只能访问哪里的数据!”
二、编译作用域:Vue世界的“快递规则”
2.1 什么是编译作用域?
用个生活中的比喻:你从北京寄快递到上海,包裹里的东西在北京就确定好了。快递员(子组件)只是负责运送,不能往里面加上海特产。
在Vue中同样如此:
- 父模板中的插槽内容,在父级作用域编译
- 子模板中的内容,在子级作用域编译
- 两者泾渭分明,就像两个不同的“国家”
2.2 官方规则的“大白话”解读
Vue文档说:“父级模板里的所有内容都是在父级作用域中编译的;子模板里的所有内容都是在子级作用域中编译的。”
翻译成人话:“谁的地盘谁做主!”
<!-- 父组件 -->
<template>
<Child>
<!-- 这里属于父组件地盘,只能访问父组件的数据 -->
<p>{
{ parentData }}</p> <!-- ✅ 能访问 -->
<p>{
{ childData }}</p> <!-- ❌ 不能访问 -->
</Child>
</template>
三、基础插槽:理解数据传递的“单行道”
3.1 默认插槽的“领地意识”
让我们用个更形象的例子——快递柜:
<!-- 快递柜组件 ExpressLocker.vue -->
<template>
<div class="locker">
<h4>📦 小区快递柜</h4>
<slot></slot> <!-- 这里是放快递的格子 -->
</div>
</template>
<script>
export default {
data() {
return {
lockerCode: 'A-1024' // 柜子编号
}
}
}
</script>
<!-- 业主组件 Owner.vue -->
<template>
<ExpressLocker>
<!-- 业主在自家准备要寄的东西 -->
<div class="package">
<p>寄件人:{
{ ownerName }}</p> <!-- ✅ 业主自己的名字 -->
<p>柜子编号:{
{ lockerCode }}</p> <!-- ❌ 看不到柜子编号! -->
</div>
</ExpressLocker>
</template>
<script>

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



