Vue3学习和进阶

Vue的简介

一、什么是vue?

Vue是一款用于构建用户界面的javascript框架。它基于标准的HTML、CSS、JS进行构建,并且提供的一套声明式的,组件化的编程模型,进而帮助我们高效开发用户界面。无论是复杂还是简单的界面,我们都可以用vue进行胜任的。

基本的示例如下:

import { createApp, ref } from 'vue'createApp({setup() {return {count: ref(0)}}
}).mount('#app')
<div id="app"><button @click="count++">Count is: {{ count }}</button>
</div>

以上的示例可以完全给我们进行展示了Vue的两大核心的功能

  • 声明响应式:Vue基于标准的HTML拓展的一套模板语法,使得我们可以声明式的描述最终输出的HTML和Javascript状态直接的关系
  • 响应式:vue会进行自动的跟踪javascript状态并在其发生变化时响应式的更新DOM.

二、Vue的优势特点

1- 渐进式框架

vue是一个框架,也是一个生态。其功能已经覆盖了大部分前端的常见开发的需求了。为了考虑到web世界的多样化满足不同开发者的需求,这里vue同样的也设计的更加的灵活和“可以被逐步集成”这个特点。我们根据需求场景的不同可以用不同的方式使用Vue的

  • 独立脚本( Vue 可以以一个单独 JS 文件的形式使用,无需构建步骤!如果你的后端框架已经渲染了大部分的 HTML,或者你的前端逻辑并不复杂,不需要构建步骤,这是最简单的使用 Vue 的方式。在这些场景中你可以将 Vue 看作一个更加声明式的 jQuery 替代品 )

  • 作为 Web Component 嵌入( 你可以用 Vue 来构建标准的 Web Component,这些 Web Component 可以嵌入到任何 HTML 页面中,无论它们是如何被渲染的。这个方式让你能够在不需要顾虑最终使用场景的情况下使用 Vue:因为生成的 Web Component 可以嵌入到旧应用、静态 HTML,甚至用其他框架构建的应用中。)

  • 单页面应用 (SPA)( 一些应用在前端需要具有丰富的交互性、较深的会话和复杂的状态逻辑。构建这类应用的最佳方法是使用这样一种架构:Vue 不仅控制整个页面,还负责处理抓取新数据,并在无需重新加载的前提下处理页面切换。这种类型的应用通常称为单页应用 (Single-Page application,缩写为 SPA)。)
    Vue 提供了核心功能库和全面的工具链支持,为现代 SPA 提供了极佳的开发体验,覆盖以下方面:

    (1)客户端路由
    (2)极其快速的构建工具
    (3)IDE 支持
    (4)浏览器开发工具
    (5)TypeScript 支持
    (6)测试工具

  • 全栈 / SSR ( 纯客户端的 SPA 在首屏加载和 SEO 方面有显著的问题,因为浏览器会收到一个巨大的 HTML 空页面,只有等到 JavaScript 加载完毕才会渲染出内容。)

  • JAMStack / SSG( 如果所需的数据是静态的,那么服务端渲染可以提前完成。这意味着我们可以将整个应用预渲染为 HTML,并将其作为静态文件部署。这增强了站点的性能表现,也使部署变得更容易,因为我们无需根据请求动态地渲染页面。Vue 仍可通过激活在客户端提供交互。这一技术通常被称为静态站点生成 (SSG),也被称为 JAMStack。)

2- 单文件组件

顾名思义单文件的组件会将一个组件的逻辑(JS),模板(HTML)和样式(CSS)封装在同一个的文件里面
定义:在大多数启用了构建工具的 Vue 项目中,我们可以使用一种类似 HTML 格式的文件来书写 Vue 组件,它被称为单文件组件 (也被称为 *.vue 文件,英文 Single-File Components,缩写为 SFC)

<script setup>
import { ref } from 'vue'
const count = ref(0)
</script><template><button @click="count++">Count is: {{ count }}</button>
</template><style scoped>
button {font-weight: bold;
}
</style>

3- API 风格

Vue 的组件可以按两种不同的风格书写:选项式 API 和组合式 API。

(1)、选项式 API (Options API)
使用选项式 API,我们可以用包含多个选项的对象来描述组件的逻辑,例如 data、methods 和 mounted。选项所定义的属性都会暴露在函数内部的 this 上,它会指向当前的组件实例。

示例如下:

<script>
export default {// data() 返回的属性将会成为响应式的状态// 并且暴露在 `this` 上data() {return {count: 0}},// methods 是一些用来更改状态与触发更新的函数// 它们可以在模板中作为事件处理器绑定methods: {increment() {this.count++}},// 生命周期钩子会在组件生命周期的各个不同阶段被调用// 例如这个函数就会在组件挂载完成后被调用mounted() {console.log(`The initial count is ${this.count}.`)}
}
</script><template><button @click="increment">Count is: {{ count }}</button>
</template>

(2)、组合式 API (Composition API)
组合式API我们可以通过导入API函数的方式来描述组件的逻辑。单文件的组件中,组合式的API通常是与

下面是使用了组合式 API 与

<script setup>
import { ref, onMounted } from 'vue'// 响应式状态
const count = ref(0)// 用来修改状态、触发更新的函数
function increment() {count.value++
}// 生命周期钩子
onMounted(() => {console.log(`The initial count is ${count.value}.`)
})
</script><template><button @click="increment">Count is: {{ count }}</button>
</template>

两个的API具体的选择和使用?

两种 API 风格都能够覆盖大部分的应用场景。它们只是同一个底层系统所提供的两套不同的接口。实际上,选项式 API 是在组合式 API 的基础上实现的!关于 Vue 的基础概念和知识在它们之间都是通用的。

二者比较具体使用:

选项式 API 以“组件实例”的概念为中心 (即上述例子中的 this),对于有面向对象语言背景的用户来说,这通常与基于类的心智模型更为一致。同时,它将响应性相关的细节抽象出来,并强制按照选项来组织代码,从而对初学者而言更为友好

组合式 API 的核心思想是直接在函数作用域内定义响应式状态变量,并将从多个函数中得到的状态组合起来处理复杂问题。这种形式更加自由,也需要你对 Vue 的响应式系统有更深的理解才能高效使用。相应的,它的灵活性也使得组织和重用逻辑的模式变得更加强大

  • 当你不需要使用构建工具,或者打算主要在低复杂度的场景中使用 Vue,例如渐进增强的应用场景,推荐采用选项式 API
  • 当你打算用 Vue 构建完整的单页应用,推荐采用组合式 API + 单文件组件。

Vue3的介绍和具体使用

一、基础知识

1- Vue3概述

Vue3是一个流行的JavaScript框架,用于构建用户界面。它是Vue.js框架的下一个主要版本,由Evan You领导的Vue.js团队开发

Vue3于2020年9月正式发布,相比于Vue2,Vue3在性能、响应式系统、TypeScript支持、Composition API等方面进行了大量改进和优化。

Vue3的响应式系统采用了ES6 Proxy对象,提高了响应式系统的性能和稳定性,并且允许更好的TypeScript支持。Composition API是一个新的API,它允许按逻辑组织代码,提高代码的可维护性和重用性。此外,Vue3还具有更好的Tree-shaking支持,提高了应用程序的性能。

总体而言,Vue3是一个优秀的框架,它在性能、开发体验和可维护性方面都有所提高,是开发现代Web应用程序的不错选择

2- Vue3的特性和优势

Vue3作为目前Vue.js框架的最新版本,有许多优势和特性的,具体包括如下:

  • 更快的渲染速度和更小的包体积:Vue3通过优化虚拟DOM的实现和使用静态提升技术等方法,显著提高渲染速度和减小了包体积。
  • 有更好的TS支持:Vue3中对TypeScript的支持更加友好,包括提供了更完整的类型定义和支持装饰器的语法
  • 组合式API(Composition API):Vue3里面引入了Composition API,提供了更灵活、更可重用和更易于测试的组件逻辑复用方式。
  • 更好的响应式系统:Vue3的响应式通过proxy代理对象代替了Object.defineProperty实现,提高了性能并且可以更好的支持嵌套对象和数组。
  • 更好的调试工具支持:Vue3提供了更好的调试工具的支持,包括可视化组件树和性能分析工具等。
  • 更好的Three Shaking的支持:Vue3通过优化内部使用的依赖关系,更好的支持Tree Shaking,减小了包体积。

总的来说:Vue3给我们带来了更快,更灵活,更易于使用,更好的开发体验和更好的性能的。

3- Vue3的生命周期

Vue3的生命周期相比较Vue2来说进行了一些优化和调整,不过总得来说大同小异的。以下是Vue3的生命周期函数:

  • 1,beforeCreate:实例初始化之后,数据观测(data observer)和event/watcher事件配置之前被调用的。
  • 2,created:实例已经创建完成后被调用。在这个阶段,模板已经编译完成了,但是还没有挂载到DOM上面。
  • 3,beforeMount:在挂载开始之前被调用,即在render函数首次被调用之前。
  • 4,mount:实例挂载完成之后被调用,这个时候DOM元素已经完全被渲染出来了。
  • 5,beforeUpdate:数据更新时被调用,发生在虚拟DOM重新渲染和打补丁之前。可以在该钩子函数中进行更改数据。
  • 6,update:数据更改导致虚拟DOM重新渲染和打补丁完成时候调用。
  • 7,beforeUnmount:实例卸载之前调用,可以在这里做一些清理工作。
  • 8,unmounted:实例卸载之后调用,这里没有 this,所以无法访问数据和方法。
  • 9,errorCaptured:捕获子孙组件抛出的异常。被调用时,可以返回 false 以阻止该异常继续向上传播。

注意点:Vue3去掉了beforeDestroy和destroyed两个生命周期,取而代之的是beforeUnmount和unmounted。因为在Vue3中,所有的组件都被设计成了Teleport,即可以被迁移的,而不是被销毁的。因此,在组件卸载之前,会执行beforeUnmount,而在组件被卸载之后,会执行unmounted。

4- Vue3的模板语法

  • 1,插值表达式
    Vue3中的插值表达式使用双大括号{{}},例如:{{ message }}。Vue3也支持在插值表达式中使用JavaScript表达式。
<template><div><h1>{{ title }}</h1><p>{{ message }}</p><p>{{ num1 + num2 }}</p></div>
</template><script>
export default {data() {return {title: 'Hello Vue 3!',message: 'This is a message',num1: 10,num2: 20}}
}
</script>
  • 2,指令
    Vue3中的指令使用v-前缀,例如:v-if、v-for、v-bind等。Vue3还引入了一些新的指令,如v-model的语法被改变,现在使用v-model:value和v-model:modifier来实现双向绑定和修饰符。此外,还有一些新的指令,如v-html、v-show、v-suspense等。

v-bind用于绑定HTML属性和组件props,可以简写为“:”

<template><div><img :src="imageUrl" alt="image"><my-component :prop1="data1" :prop2="data2"></my-component></div>
</template><script>
export default {data() {return {imageUrl: 'https://example.com/image.png',data1: 'prop1',data2: 'prop2'}}
}
</script>

v-on用于绑定事件处理函数,可以简写为“@”

<template><div><button @click="clickHandler">Click me</button></div>
</template><script>
export default {methods: {clickHandler() {console.log('button clicked');}}
}
</script>

v-if用于条件渲染,根据表达式的值决定是否渲染该元素

<template><div><p v-if="show">This is a paragraph</p></div>
</template><script>
export default {data() {return {show: true}}
}
</script>

v-for用于循环渲染,渲染数组中的每一个元素

<template><div><ul><li v-for="(item, index) in items" :key="index">{{ item }}</li></ul></div>
</template><script>
export default {data() {return {items: ['item1', 'item2', 'item3']}}
}
</script>

5,Vue3的计算属性和侦听器

计算属性是根据已有的属性值(响应式依赖)计算出一个新的值,相当于是一个带有缓存的方法,只要依赖的数据没有改变,计算属性就不会重新计算。

例如,我们可以使用计算属性来根据数据列表过滤出需要展示的数据

<template><div><input type="text" v-model="keyword" /><ul><li v-for="item in filteredList" :key="403 Forbidden">{{ item.title }}</li></ul></div>
</template><script>
import { ref, computed } from 'vue';export default {setup() {const list = ref([{ id: 1, title: 'Apple' },{ id: 2, title: 'Banana' },{ id: 3, title: 'Orange' },{ id: 4, title: 'Pear' },]);const keyword = ref('');const filteredList = computed(() => {return list.value.filter((item) => {return item.title.toLowerCase().indexOf(keyword.value.toLowerCase()) !== -1;});});return {keyword,filteredList,};},
};
</script>

侦听器是用于监听数据变化并触发一些操作的方法,它可以监听到数据的变化并执行相应的操作。在 Vue3 中,我们可以使用 watch 函数来创建侦听器:

<template><div><p>Count: {{ count }}</p><button @click="increment">Increment</button></div>
</template><script>
import { ref, watch } from 'vue';export default {setup() {const count = ref(0);watch(count, (newValue, oldValue) => {console.log(`count changed from ${oldValue} to ${newValue}`);});function increment() {count.value++;}return {count,increment,};},
};
</script>

上面的代码中,我们使用 watch 函数来监听 count 变量的变化,并在变化时打印出新旧值。当用户点击 “Increment” 按钮时,count 变量的值会增加,并触发 watch 函数。

6、Vue3的事件处理

在Vue3中,事件处理是通过在模板中使用@符号来绑定事件。例如,我们可以使用@click来绑定click事件,如下所示:

<template><button @click="handleClick">Click me!</button>
</template>

在上面的代码中,我们绑定了一个click事件到button元素,并指定了一个名为handleClick的方法来处理该事件。

与传统的事件绑定不同,Vue3的事件处理方法使用了一个特殊的修饰符语法。这些修饰符可以用来指定事件的一些行为,例如阻止事件冒泡或取消默认行为。以下是一些常用的事件修饰符:

  • .stop:阻止事件冒泡。
  • .prevent:取消事件的默认行为。
  • .capture:事件在捕获阶段被处理。
  • .self:只当事件发生在该元素本身而不是子元素时触发。
  • .once:事件只会触发一次。
  • .passive:告诉浏览器不需要等待事件处理函数完成就可以滚动页面。

下面是使用装饰费的示例:

<template><div @click.stop.prevent="handleClick">Click me!</div>
</template>

在上面的代码中,我们使用了.stop和.prevent修饰符来阻止事件冒泡和取消默认行为。

除了常规的DOM事件外,Vue3还提供了自定义事件。我们可以使用$emit方法来触发自定义事件,然后在父组件中使用v-on来监听这些事件。以下是一个使用自定义事件的示例:

<template><button @click="handleClick">Click me!</button>
</template><script>
export default {methods: {handleClick() {this.$emit('custom-event', 'Hello, world!');}}
};
</script>

在上面的代码中,我们定义了一个名为custom-event的自定义事件,并在点击事件中使用$emit方法触发该事件。在父组件中,我们可以使用v-on:custom-event来监听该事件。例如:

<template><my-component @custom-event="handleCustomEvent"></my-component>
</template><script>
import MyComponent from './MyComponent.vue';export default {components: {MyComponent},methods: {handleCustomEvent(message) {console.log(message); // 输出:Hello, world!}}
};
</script>

在上面的代码中,我们在父组件中使用@custom-event来监听自定义事件,并在handleCustomEvent方法中获取传递的参数。

二、组件化开发

1- Vue3的组件化开发

Vue3 是一个基于组件化开发的前端框架,因此组件化开发是 Vue3 的核心。Vue3 组件是由一组可复用的模板、样式和逻辑组成的,它可以被其他组件或者页面引用。

组件的核心是一个 Vue 实例,它可以使用 Vue 提供的选项进行配置,例如 data、methods、computed 等选项。一个 Vue 组件可以接受父组件传递的参数,也可以向父组件发送事件。

Vue3 提供了一个 defineComponent 函数来定义组件,这个函数接收一个配置对象作为参数,配置对象中包含了组件的各种选项。
下面是关于Vue组件的简单示例:

<template><div class="counter"><h1>{{ count }}</h1><button @click="increment">+1</button></div>
</template><script>
import { defineComponent, ref } from 'vue';export default defineComponent({name: 'Counter',setup() {const count = ref(0);const increment = () => {count.value++;};return {count,increment,};},
});
</script><style>
.counter {display: flex;flex-direction: column;align-items: center;
}
</style>

在这个组件里面,我们使用Vue3的defineComponent函数定义一个名为Counter的组件。组件中有一个count变量和一个increment方法,count变量的初始值是0,increment方法每次调用可以把count值加1。我们使用了插值表达式将 count 的值渲染到页面中,并使用 @click 指令绑定了 increment 方法。

这个示例展示了 Vue3 组件的基本结构,包括模板、脚本和样式。在 setup 函数中定义组件的状态和行为,然后将它们返回,让模板可以访问。

2- Vue的组件通信详解

Vue3中的组件通信可以使用props和事件两种方式来实现。

  • 1,props通信如下:
    props主要是父组件向子组件传递数据的方式。子组件通过props进行接手数据,这种数据流是单向的。即只能从父组件流向子组件的。
    父组件中使用props向子组件进行传递数据

Vue2里面的写法

<template><child-component :message="messageFromParent" />
</template>
<script>
import ChildComponent from './ChildComponent.vue';export default {components: {ChildComponent},data() {return {messageFromParent: 'Hello from parent'}}
}
</script>

子组件中,我们通过props进行接收数据

<template><div>{{ message }}</div>
</template>
<script>
export default {props: {message: {type: String,default: ''}}
}
</script>

vue3里面的写法

<template><div>这里是父组件</div><input type="text" v-model="inputMsg"/><div>inputMsg:{{inputMsg}}</div><div>msg:{{msg}}</div><div><button @click="changeMsg">点击修改</button></div><div style="margin: 10px;">分割线-------------------------</div><childView:toMsg="msg":toFunc="func"
></childView></template><script setup>
import { reactive, ref } from 'vue';
import  childView  from './edit.vue'const inputMsg = ref('这里是父组件的消息')
const msg = ref('')const func = () =>{changeMsg()
}const changeMsg = () => {msg.value = inputMsg.value
}</script>

子组件

<template><div><div>这里是子组件</div><div>收到父组件消息toMsg:{{toMsg}}</div></div><div><button @click="toFunc">点击执行收到的父组件方法</button></div><div><button @click="changeMsg">点击修改toMsg</button></div></template><script setup>// 需要定义defineProps
const props = defineProps({toMsg: {type: String,default: 100,},toFunc: {type: Function,default: async () => {},}
})const changeMsg = () => {props.toMsg = "子组件修改"
}//或者直接接受,不设定类型与默认值
const props = defineProps(['toMsg '])
</script><style>
</style>

对于取值:setup中要通过props.msg取到,模板中直接msg取到

  • 2,事件
    事件是一种在子组件向父组件通信的方式

vue2里面的写法

在子组件中定义事件:

<template><button @click="onClick">Click me</button>
</template>
<script>
export default {methods: {onClick() {this.$emit('button-clicked', 'Button clicked in child component');}}
}
</script>

在父组件中,通过v-on(缩写@)指令监听子组件触发的事件:

<template><child-component @button-clicked="onButtonClicked" />
</template>
<script>
import ChildComponent from './ChildComponent.vue';export default {components: {ChildComponent},methods: {onButtonClicked(message) {console.log(message);}}
}
</script>

这样,当子组件中的按钮被点击时,会触发button-clicked事件,父组件会调用onButtonClicked()方法,并接收子组件传递的数据。

vue3里面的写法
emit是最常见的用于子组件向父组件传递消息的方法vue3使用使用defineEmits来声明emit,它接收内容与emit选项是一致的。

(1)用法一:给父组件发送自定义事件

// ----------子组件--------<button @click="btn">点击</button>
<script setup>
import {defineEmits} from 'vue'
const emit = defineEmits(['emit']) //数组里可以有多个自定义方法名
//或者使用ts约束自定义方法的参数
const emit = defineEmits<{(e:'getAge',age:number):void //设置自定义函数名称,参数类型与返回值类型// 可在此设置第二个自定义函数
}>()function btn() {emit('getAge',18)
}
</script>// ---------父级组件中--------// 在父级组件中,使用子级的自定义事件,在html中去写@自定义事件名称=事件名称(就是在子组件中emits的第一个参数)<HelloWorld @getAge="handleAge"/>
<script setup>
import HelloWorld from '@/components/HelloWorld'
// 函数中data是个形参,为子级传递过来的数据
const handleAge = function (data) {console.log(data)
}
</script>

(2)用法二:使用modelValue直接更新父组件数据

除了props和事件,Vue3中还提供了provide/inject、$refs等方式来实现组件通信。

//结构  
// 父组件:<CHild v-model:test="test"></CHild>//逻辑
let test =ref()// 子组件//逻辑
const props = defineProps({
test:'',
})
const emit = defineEmits(['update:test']);  //这个test就是接收的props
const resetTest =() =>{
//更新test给父组件
emit('update:test','最新数据')
}

这样父组件不需要自定义事件就能接受到最新的test数据。!

注意:不管使用props 或者emits 在vue3 里面都需要使用 defineProps 和 defineEmits 声明。

Vue2 里面父组件中调用子组件方法

方法1:通过$refs来进行调用。

// 子组件<template><div>我是子组件</div></template><script>export default {data() {return {name: 'jack'}},methods: {childrenFuc() {//在这里做某些子组件的操作。更菜子组件的值等等this.name = 'Tom'}}}</script>// 父组件<template><childBody ref="childRef"></childBody><button @click="handleClick">点击按钮</button></template><script>export default {data() {return {name: 'jack'}},methods: {handleClick() {//通过点击事件触发子组件的函数方法this.$refs.childRef.childrenFuc();}}}</script>

方法2:使用emit 和 emit和emit和on的方法

在子组件的mounted或者created定义需要触发的函数

// 子组件<template><div>我是子组件</div></template><script>export default {data() {return {name: 'jack'}},mounted() {//使用$nextTick方法,确保dom渲染完毕后加载该函数。this.$nextTick(function () {this.$on("childrenFuc", () => {//在这里做某些子组件的操作。更菜子组件的值等等this.name = 'Tom'})})}}</script>
// 父组件<template><childBody ref="childRef"></childBody><button @click="handleClick">点击按钮</button></template><script>export default {data() {return {}},methods: {handleClick() {//触发子组件的方法。this.$refs.childRef.$emit("childrenFuc");}},}</script>

vue3 里面父组件中调用子组件方法
1:通过ref直接调用子组件的方法 ref=“RefChild”;

2:在函数中写 RefChild.value.reset();, “reset”为子组件中定义的函数名。

3:子组件定义一个函数 reset(),使用defineExpose抛出,让父组件调用即可。

4:这个方法也可以进行传值,在括号中传入值,子组件接收即可 。

父组件

<template><div class="vc-box"><el-button-group><el-button:type="tabletype === '1' ? 'primary' : ''"@click="selectTable('1')">按钮1</el-button><el-button:type="tabletype === '2' ? 'primary' : ''"@click="selectTable('2')">按钮2</el-button><el-button:type="tabletype === '3' ? 'primary' : ''"@click="selectTable('3')">按钮3</el-button></el-button-group><Childref="RefChild"@onselect="handleCriterionChange"v-if="tabletype === '测试'"></Child></div>
</template><script name="index" setup lang="ts">
import Child from '@/modular/analysis/components/child.vue';const tabletype = ref();// 获取子组件的引用
const RefChild = ref();const selectTable = i => {if (RefChild.value) {RefChild.value.reset();}
}const handleCriterionChange = (type: number) => {console.log('输出点击事件')
}</script>

子组件

<template><el-form :model="criterionForm"><el-form-item label="规范类别"><el-selectv-model="criterionForm.criterionType"class="m-2"style="width: 130px"placeholder="Select"size="default"@change="type => emits('onselect', type)"><el-optionv-for="item in criterionOptions":key="item.value":label="item.label":value="item.value"/></el-select></el-form-item></el-form>
</template>
<script setup lang="ts">
import { Ref } from 'vue';const emits = defineEmits<{ (e: 'onselect', value: number): void }>();const criterionForm: Ref<{ criterionType: number }> = ref({// 默认展示全部criterionType: 0
});const reset = () => {criterionForm.value.criterionType = 0;
};const criterionOptions = [{label: '全部',value: 0},{label: '合格',value: 1},{label: '不合格',value: 2}
];defineExpose({reset
});
</script>

Vue3里面也支持provide / inject(祖孙、父子组件)
Vue3里面兄弟组件目前使用mitt,vue到3.0之后好像取消了bus全局事件总线,选择使用mitt作为兄弟组件间通信和传参的方式。mitt的使用方法有两种:可以单独创建一个文件,哪里要用就引入它;也可以 main.js 中挂载全局属性;

  • 3、Vue3的插槽

插槽是Vue3中用于在组件之间共享内容的一种机制。简单来说,它们允许我们将内容插入到组件的特定区域中。Vue3中的插槽分为两种类型:具名插槽默认插槽

Vue3中的插槽是一个强大的工具,可以帮助我们更好地管理组件之间的内容共享。通过使用插槽,我们可以更好地控制组件中的内容,使其更易于维护和扩展。如果您正在使用Vue3构建Web应用程序,插槽是一个不容错过的功能。

简单的实例如下:

<!-- 父组件 -->
<template><div><h1>{{ title }}</h1><slot></slot></div>
</template><script>
export default {name: 'MyComponent',props: {title: {type: String,required: true}}
}
</script>

在父组件中,我们定义了一个插槽,它表示该组件可以接收子组件传递过来的任何内容,并将其渲染在插槽所在的位置。

现在,我们可以在父组件标签内传入任何我们想要展示的内容,例如:

<!-- 使用父组件,并在其中传入一些内容 -->
<my-component title="这是标题"><p>这是一些内容</p><ul><li>列表项1</li><li>列表项2</li></ul>
</my-component>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/787487.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mongodb的简单操作

文章目录 前言数据库的创建和删除集合的创建和删除文档的插入和查询异常处理更新数据局部修改符合条件的批量更新加操作 删除文档删除全部数据删除符合条件的数据 统计count统计有多少条数据统计特定条件有多少条数据 分页查询排序查询正则查询比较查询包含查询条件连接查询索引…

【文件操作API的使用】

1.概念 这对聪明的你们来说简直就是&#xff0c;对吗。 那什么是文件操作符&#xff0c;文件操作又有哪些步骤呢&#xff1f; 文件操作符通常用于指代在计算机编程中用于处理文件的特殊符号或标识符。在很多编程语言中&#xff0c;文件操作符被用于打开、关闭、读取和写入文件…

香港科技大学广州|数据科学与分析学域硕博招生宣讲会—天津大学专场

时间&#xff1a;2024年4月12日&#xff08;星期五&#xff09;14:00 地点&#xff1a;天津大学北洋园校区55楼B204 报名链接&#xff1a;https://www.wjx.top/vm/Q0cKTUI.aspx# 跨学科研究领域 *数据驱动的人工智能和机器学习 *统计学习和建模 工业和商业分析 *特定行业的数…

两阶段提交-mysql

二阶段提交的 prepare 阶段&#xff0c;InnoDB 主要做五件事。 第 1 件&#xff0c;把分配给事务的所有 undo 段的状态从 TRX_UNDO_ACTIVE 修改为 TRX_UNDO_PREPARED。 进入二阶段提交的事务&#xff0c;都至少改变过&#xff08;插入、更新、删除&#xff09;一个用户表的一…

工艺品wordpress外贸主题

工艺品wordpress外贸主题 简约大气的wordpress外贸主题&#xff0c;适合做工艺品进出品外贸的公司官网使用。 https://www.jianzhanpress.com/?p5377

社交媒体市场:揭示Facebook的商业模式

在数字化时代&#xff0c;社交媒体已经成为人们生活中不可或缺的一部分。Facebook作为全球最大的社交媒体平台之一&#xff0c;其商业模式的运作方式对于了解社交媒体市场的发展趋势和影响力至关重要。本文将深入探讨Facebook的商业模式&#xff0c;剖析其运作机制&#xff0c;…

【Java面试题系列】基础篇

目录 基本常识标识符的命名规则八种基本数据类型的大小&#xff0c;以及他们的封装类3*0.10.3返回值是什么short s1 1; s1 s1 1;有什么错? short s1 1; s1 1;有什么错?简述&&与&的区别&#xff1f;简述break与continue、return的区别&#xff1f;Arrays类的…

微服务(基础篇-007-RabbitMQ部署指南)

目录 05-RabbitMQ快速入门--介绍和安装_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1LQ4y127n4?p65&vd_source60a35a11f813c6dff0b76089e5e138cc 1.单机部署 1.1.下载镜像 1.2.安装MQ 2.集群部署 2.1.集群分类 2.2.设置网络 视频地址&#xff1a; 05-Rab…

项目:USB键盘和鼠标的复合设备

我们的复合设备使用一个物理设备就可以完成多个功能。 使用复合设备同时完成USB键盘和鼠标功能&#xff0c;它的主要实现方式有两种&#xff0c; 第一个就是我们将多个设备描述符合并成一个&#xff0c;这个相对比较简单&#xff0c;我们只要根据相应的报告描述符处理数据就可…

vue3的ref和reactive对比

一&#xff0c;ref 作用: 定义一个 ref 响应式的数据语法: const xxx ref(initValue) 用法 创建一个包含响应式数据的引用对象&#xff08;reference对象&#xff0c;简称ref对象&#xff09;。 JS中操作数据&#xff1a; xxx.value 模板中读取数据: 不需要.value&#xff0…

Android 解决TextView多行滑动与NestedScrollView嵌套滑动冲突的问题

关键计算地方: 1.当前是上滑动还是下滑动(相对于屏幕) ,使用ev.getRawY()获得当前滑动位置在屏幕哪个地方 2. 计算文本客滑动到哪里即可停止, (行高*总文本行数)- (行高 * 最多显示行数) int sum getLineHeight() * getLineCount() - getLineHeight() * getMaxLines(); …

Red Hat配置本地yum源

Red Hat配置本地yum源 创建本地源文件夹 mkdir -p /mnt/cdrom挂载镜像文件至指定的目录 mount /dev/cdrom /mnt/cdrom备份本地源 cp -rf /etc/yum.repos.d /etc/yum.repos.d_$(date %Y%m%d_%H%M%S)删除默认原本地源 rm -rf /etc/yum.repos.d/*配置本地源&#xff0c;创建…

分享一个Python爬虫入门实例(有源码,学习使用)

一、爬虫基础知识 Python爬虫是一种使用Python编程语言实现的自动化获取网页数据的技术。它广泛应用于数据采集、数据分析、网络监测等领域。以下是对Python爬虫的详细介绍: 架构和组成:下载器:负责根据指定的URL下载网页内容,常用的库有Requests和urllib。解析器:用于解…

一文涵盖所有工作中遇到的redis操作,让你从此学会redis

一文涵盖所有工作中遇到的redis操作&#xff0c;让你从此学会redis 本文会从基础篇到进阶篇&#xff0c;逐步来讲解redis和springboot的整合&#xff0c;如何去操作&#xff0c;以及他的作用。让你学会使用redis&#xff0c;爱上使用redis。 介绍redis 首先我们来介绍一下re…

如何在Linux系统运行RStudio Server并实现无公网IP远程访问【内网穿透】

文章目录 推荐 前言1. 安装RStudio Server2. 本地访问3. Linux 安装cpolar4. 配置RStudio server公网访问地址5. 公网远程访问RStudio6. 固定RStudio公网地址 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下…

c++的学习之路:7、类和对象(3)

一、初始化列表 初始化列表&#xff1a;以一个冒号开始&#xff0c;接着是一个以逗号分隔的数据成员列表&#xff0c;每个"成员变量"后面跟一个放在括号中的初始值或表达式&#xff0c;如下方代码就是初始化列表的方式。从图片可以看出这种方式也可以利用缺省初始化…

vue项目双击from表单限制重复提交 添加全局注册自定义函数

第一步: 找到utils文件夹添加directive.js文件 import Vue from vue //全局防抖函数 // 在vue上挂载一个指量 preventReClick const preventReClick Vue.directive(preventReClick, {inserted: function (el, binding) {console.log(el.disabled)el.addEventListener(click,…

rs485自动收发电路

R/RO&#xff1a;receive/receive out&#xff0c;接收&#xff0c;连接单片机的 rx D/DI&#xff1a;drive/drive in&#xff0c;驱动&#xff0c;连接单片机的 tx 自动控制电路的目的就是在 tx 空闲&#xff08;空闲为高并&#xff09;时拉低 RE 和 DE&#xff0c;工作&…

【Python】【Flask】提交表单后报500错误

【背景】 日常用户使用的一个Online的基于Flask做的工具,今天忽然报错,看现象是点击表单提交按钮后发生错误。报500内部错误。 【分析】 用print步步为营接近root cause。 报错对应视图函数的展示部分正常执行。提交表单按钮后的内容全部没有正常执行。 提交表单用的方法是…

设计模式(15):迭代器模式

介绍 提供一中可以遍历聚合对象的方式。又称为: 游标cursor模式 迭代器模式角色 抽象聚合类(Aggregate)&#xff1a;提供了聚合相关的方法,并提供获取迭代器的方法&#xff1b;具体集合类(ConcreteAggregate):实现了抽象聚合类&#xff1b;抽象迭代器(Iterator)&#xff1a;…