Vue 组件 - Slot 内容分发

 Vue 渐进式JavaScript 框架 基于Vue2的学习笔记 - Vue组件 - Slot 内容分发

目录

Slot内容分发

旧版slot

单插槽

使用插槽

具名插槽

插槽实现导航

使用插槽优点

新版slot

Or

插槽版抽屉

总结


Slot内容分发

混合父组件的内容和子组件自己模板 -- 内容分发

父组件模板的内容在父组件作用域内编译,子组件模板内容在子组件作用域内编译。

旧版slot

如果直接在组件内部放入自定义内容是无法显示的;

slot插槽技术,可以在组件内部自定义显示内容。

单插槽

首先创建一个组件,在组件中设置好插槽位置,注意slot是固定的。

示例如下:

<script>
    Vue.component("child", {
        template:`
        <div>
            child
            <slot></slot>
        </div>
        `
    })

    let vm = new Vue({
        el:"#box"
    })
</script>

使用插槽

写一行会在插槽中显示一行,多行的话,也会出现多行;

示例如下:

<div id="box">
    <!--当前组件或者节点 在哪个模板中,就能访问哪个模板状态-->
    <child>
        <div>面朝大海</div>
        <div>春暖花开</div>
    </child>
</div>

效果如下:

这叫做单个插槽写法。

具名插槽

如果要使用多个自定义内容的,可以使用具名插槽。

修改原有组件内容,改为具名插槽格式。

示例如下:

Vue.component("child", {
    template:`
    <div>
        child
        <slot name="a"></slot>
        <slot name="b"></slot>
        <slot name="c"></slot>
        <slot></slot>
    </div>
    `
})

组件使用slot,进行对号入座。

示例如下:

<div id="box">
    <!--当前组件或者节点 在哪个模板中,就能访问哪个模板状态-->
    <child>
        <div slot="a">面朝大海</div>
        <div slot="b">春暖花开</div>
        <div slot="c">从明天起做一个快乐的人</div>
        <div>劈柴喂马 关心粮食和蔬菜</div>
    </child>
</div>

效果如下:

插槽实现导航

利用slot可以实现导航栏和导航图标的灵活显示。

使用slot插槽后不再受到内置组件限制。

示例如下:

<div id="box">
    <!--当前组件或者节点 在哪个模板中,就能访问哪个模板状态-->
    <navbar>
        <button slot="left"> < 返回</button>
        <i class="icon" slot="right">字体图标</i>
    </navbar>
</div>
<script>
    Vue.component("navbar", {
        template:`
        <div>
            <slot name="left"></solt>
            <span>navbar</span>
            <slot name="right"></solt>
        </div>
        `
    })

    let vm = new Vue({
        el:"#box"
    })
</script>

使用插槽优点

通过插槽自定义导航栏两侧的内容。

扩展组件能力,提高组件复用性。

新版slot

新版slot是2.6版本的vue。并不是3后的版本。

以前的slot不知道算属性还是指令。

现在明确为指令写法,#号为简写方式,上面是指令写法。

定义组件和插槽不需修改。

示例如下:

<child>
    <template v-slot:a>
        <div>面朝大海</div>
    </template>
    <template v-slot:b>
        <div>春暖花开</div>
    </template>
</child>
Or
<navbar>
    <template #left>
        <button> < 返回 </button>
    </template>
    <template #right>
        <i class="icon">字体图标</i>
    </template>
</navbar>

 官网示例

插槽版抽屉

对原有的抽屉(子传父示例)改为插槽版。

即原来的导航列表的打开和关闭功能。

示例如下:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
<script src="../lib/vue.js"></script>
<div id="box">
  <navbar>
    <button @click="isShow=!isShow">点击</button>
  </navbar>
  <sidebar v-show="isShow"></sidebar>
</div>
<script>
  // 定义一个全局组件
  Vue.component("navbar", {
    template: `<div style="background-color: red">
            nabbar- <slot></slot>
        </div>`,
  })

  Vue.component("sidebar", {
    template:`<div style="background-color: yellow">
    <ul>
    <li>第一行</li>
    <li>第二行</li>
    <li>第三行</li>
</ul>
</div>`
  })
  let vm = new Vue({
    el:"#box",
    data:{
      isShow: true
    }
  })
</script>
</body>
</html>

 去掉Vue原有监听和触发事件,只通过isShow取反后的值判断来显示。

总结

Vue 渐进式JavaScript 框架 基于Vue2的学习笔记 - Vue组件 -  Slot 内容分发

<think>首先,用户的问题是关于Vue 3中的watch函数用法和示例。我需要根据系统级指令来构建我的回答。指令包括:使用$...$格式表示行内数学表达式(但这里不涉及数学,所以可能不需要),独立公式用$$...$$,但Vue 3主题不太可能用到数学公式。确保LaTeX语法正确,但同样,主题是编程,所以可能不适用。使用中文回答。生成相关问题。在回答中引用的段落末尾添加引用标识。 用户提供了引用内容,这些引用是关于Vue 3的watch函数的,所以我应该参考这些来构建回答。引用包括: - [^1]: Vue3 指南:掌握 watch 函数的正确使用方法。基本示例监听响应式引用。 - [^2]: 第41节: Vue3 watch函数。示例监听message变化。 - [^3]: Vue3学习(5)- watch和watchEffect的使用。watch可以监视四种数据:ref, reactive, getter函数, 数组。 - [^4]: Vue学习-watch函数的用法。代码示例监听ref对象。 - [^5]: vue3中watch 函数参数说明。子组件中监听props变化。 用户的问题是:"我想了解如何在Vue 3中使用watch函数 请问Vue 3 watch函数用法和示例"。所以,我需要解释watch函数的用法并提供示例。 回答结构需要清晰,帮助用户逐步解决问题。内容要真实可靠,基于提供的引用。 大纲回答: 1. **介绍watch函数**:解释watch函数在Vue 3中的作用,用于侦听响应式数据变化。 2. **基本用法**:描述如何使用watch函数,包括参数。 3. **示例**:提供代码示例,展示不同场景: - 监听ref数据 - 监听reactive数据 - 监听props(在组件中) - 其他类型如getter函数或数组 4. **注意事项**:提到watch函数的限制或特点,如只能监视特定类型数据。 5. **生成相关问题**:在回答末尾,添加相关问题部分。 引用标识:在引用内容末尾添加[^n],其中n是引用编号。例如,如果我从引用[1]中提取信息,就在那段末尾加[^1]。 确保回答是中文。 生成相关问题:指令说“生成相关问题”,并参考示例(如快速排序后的问题)。所以,在回答末尾,添加“§§相关问题§§”部分,列出几个相关问题。 相关问题示例: 1. watch函数和watchEffect的区别是什么? 2. 如何在Vue 3中监听深层对象的变化? 3. watch函数的性能优化技巧? 4. 在组合式API中如何正确使用watch? 现在,构建回答内容。 **回答结构:** - 开头简要介绍watch函数。 - 逐步解释用法: - 导入watch函数 - 基本语法:watch(source, callback, options) - 示例1:监听ref(基于引用[4]) - 示例2:监听reactive对象(基于引用[3]) - 示例3:监听props(基于引用[5]) - 提到其他类型如getter函数 - 添加注意事项,如immediate和deep选项。 - 结尾生成相关问题。 添加引用标识:例如,在描述用法时,如果信息来自引用[1],就加[^1]。 确保代码块格式正确:在Markdown中使用```来包裹代码。 最终,添加相关问题部分。</think>### Vue 3 中 watch 函数的用法与示例 在 Vue 3 中,`watch` 函数是组合式 API 的核心工具之一,用于侦听响应式数据的变化。当数据更新时,它可以触发自定义回调函数,执行副作用操作(如日志记录、数据同步或 API 调用)。`watch` 支持侦听多种数据类型,包括 `ref`、`reactive`、getter 函数或数组。下面我将一步步解释其用法,并提供代码示例。所有示例均基于 Vue 3 的组合式 API(使用 `<script setup>` 语法),确保内容真实可靠。 #### 1. **基本用法与语法** `watch` 函数需要导入自 `vue` 包,其基本语法为: ```javascript watch(source, callback, options) ``` - **source**:要侦听的数据源,可以是 `ref` 对象、`reactive` 对象、getter 函数(返回一个值)或这些类型的数组。 - **callback**:数据变化时执行的回调函数,参数为 `(newValue, oldValue)`。 - **options**(可选):配置对象,支持 `immediate`(立即执行回调)和 `deep`(深度侦听嵌套对象)等选项[^1][^3]。 Vue 3 的 `watch` 只能监视四种类型的数据:`ref` 定义的响应式引用、`reactive` 定义的响应式对象、getter 函数返回的值,或包含上述内容的数组[^3]。如果数据源类型不匹配,`watch` 可能无效。 #### 2. **示例:监听 ref 数据** `ref` 用于基本类型(如数字、字符串)。侦听时直接传入 `ref` 对象,无需 `.value`。以下示例监听一个计数器 `count` 的变化,并在控制台输出新旧值。 ```vue <script setup> import { ref, watch } from 'vue'; const count = ref(0); const addCount = () => { count.value++; }; watch(count, (newValue, oldValue) => { console.log('count 变化了', '新值:', newValue, '旧值:', oldValue); }); </script> <template> <div>{{ count }}</div> <button @click="addCount">增加</button> </template> ``` 当点击按钮时,`count` 增加,回调函数自动执行。此示例展示了 `watch` 在简单状态管理中的应用[^4]。 #### 3. **示例:监听 reactive 对象** `reactive` 用于对象或数组。侦听时需指定具体属性或使用 getter 函数,避免直接侦听整个对象(可能导致性能问题)。以下示例侦听 `user` 对象的 `name` 属性。 ```vue <script setup> import { reactive, watch } from 'vue'; const user = reactive({ name: 'Alice', age: 25 }); const updateName = () => { user.name = 'Bob'; }; // 使用 getter 函数指定侦听属性 watch( () => user.name, // source 为 getter 函数 (newVal, oldVal) => { console.log(`用户名从 ${oldVal} 变为 ${newVal}`); } ); </script> <template> <div>{{ user.name }}</div> <button @click="updateName">更新名字</button> </template> ``` 如果侦听整个 `reactive` 对象,需启用 `deep: true` 选项来深度追踪嵌套变化[^3]。 #### 4. **示例:监听 props(在组件中)** 在组件间通信时,`watch` 常用于侦听父组件传递的 `props`。以下子组件示例侦听 `parentValue` 的变化。 ```vue <!--组件 Child.vue --> <script setup> import { defineProps, watch } from 'vue'; const props = defineProps({ parentValue: { type: null, // 支持任意类型 default: null } }); watch( () => props.parentValue, // source 为 getter 函数 (newVal, oldVal) => { console.log(`父组件值从 ${oldVal} 变为 ${newVal}`); }, { immediate: true } // 选项:组件挂载时立即执行一次 ); </script> <template> <div>接收到的值: {{ parentValue }}</div> </template> ``` 此例中,`immediate: true` 确保初始化时触发回调,便于处理默认值[^5]。 #### 5. **高级用法与注意事项** - **侦听多个数据源**:传入数组作为 `source`,回调参数也变为数组形式。例如: ```javascript watch([ref1, () => reactiveObj.key], ([newRef, newReactive], [oldRef, oldReactive]) => { // 处理变化 }); ``` - **性能优化**:默认 `watch` 是浅层侦听。对于嵌套对象,使用 `deep: true` 选项,但需谨慎以避免性能开销[^3]。 - **与 watchEffect 的区别**:`watch` 需显式指定数据源,而 `watchEffect` 自动追踪依赖。`watch` 更适合精确控制侦听逻辑[^1][^3]。 - **清理副作用**:在回调中返回一个函数可清理资源(如定时器),类似于 Vue 2 的 `$watch`。 通过以上示例,您可以在项目中灵活应用 `watch` 函数来处理数据响应逻辑。如需更多细节,参考 Vue 官方文档。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

JSON_L

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

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

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

打赏作者

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

抵扣说明:

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

余额充值