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

前端框架Vue

Vue

学习路线

在这里插入图片描述

  1. 学习HTML、CSS和JavaScript基础知识:Vue是基于JavaScript的框架,所以首先需要掌握HTML、CSS和JavaScript的基础知识,包括DOM操作、事件处理、变量和函数等。

  2. 学习Vue的基本概念:了解Vue的核心概念,如Vue实例、组件、指令、生命周期等。可以通过官方文档、教程或者在线课程来学习。

  3. 掌握Vue的基本语法:学习Vue的模板语法、指令和数据绑定等基本语法,包括v-bind、v-on、v-if、v-for等常用指令的使用方法。

  4. 学习Vue的组件化开发:Vue是一个组件化的框架,学习如何创建和使用Vue组件,以及组件之间的通信和交互。

  5. 学习Vue的路由和状态管理:学习Vue的路由和状态管理工具,如Vue Router和Vuex,用于实现单页面应用的路由和状态管理。

  6. 实践项目开发:通过实践项目来巩固所学的知识,可以选择一些简单的项目开始,逐渐增加项目的复杂度和功能。

  7. 深入学习Vue的高级特性:学习Vue的高级特性,如自定义指令、混入、插件等,以及Vue的性能优化和调试技巧。

  8. 持续学习和实践:Vue是一个不断发展的框架,持续学习和实践是提高自己的关键。可以通过阅读官方文档、参与社区讨论、参加相关的培训和活动等方式来不断提升自己的Vue技能。

介绍

官方网站:https://cn.vuejs.org/

  • Vue.js是一种用于构建用户界面的开源渐进式JavaScript框架。
  • 它是一种轻量级的框架,易于学习和使用。
  • 它基于标准HTML,CSS和JavaScript构建,并提供了一套声明式的,组件时的编程模型,帮助开发人员高效的开发用户界面。无论简单还是复杂的界面,Vue都可以胜任。
  • Vue.js采用了组件化的开发方式,使得开发者可以将一个页面拆分为多个可复用的组件,从而提高代码的可维护性和复用性。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-377mq144-1688373083288)(E:\VUE笔记\VUE.assets\image-20230630110004514.png)]

特点

  • 响应式:

    • Vue.js使用了双向数据绑定的机制,当数据发生变化时,页面会自动更新,无需手动操作DOM。
  • 组件化:

    • Vue.js将页面拆分为多个组件,每个组件都有自己的逻辑和样式,可以独立开发和维护。
  • 轻量级:

    • Vue.js的体积较小,加载速度快,性能优秀。
  • 简单易用:

    • Vue.js提供了简洁的API和清晰的文档,使得开发者可以快速上手并进行开发。
  • 生态丰富:

    • Vue.js拥有庞大的社区和生态系统,有大量的插件和工具可供选择,方便开发者进行扩展和集成。

渐进式框架

Vue 是一个框架,也是一个生态。其功能覆盖了大部分前端开发常见的需求。但 Web 世界是十分多样化的,不同的开发者在 Web 上构建的东西可能在形式和规模上会有很大的不同。考虑到这一点,Vue 的设计非常注重灵活性和“可以被逐步集成”这个特点。根据你的需求场景,你可以用不同的方式使用 Vue:

  • 无需构建步骤,渐进式增强静态的 HTML
  • 在任何页面中作为 Web Components 嵌入
  • 单页应用 (SPA)
  • 全栈 / 服务端渲染 (SSR)
  • Jamstack / 静态站点生成 (SSG)
  • 开发桌面端、移动端、WebGL,甚至是命令行终端中的界面

无论再怎么灵活,Vue 的核心知识在所有这些用例中都是通用的。即使你现在只是一个初学者,随着你的不断成长,到未来有能力实现更复杂的项目时,这一路上获得的知识依然会适用。如果你已经是一个老手,你可以根据实际场景来选择使用 Vue 的最佳方式,在各种场景下都可以保持同样的开发效率。这就是为什么我们将 Vue 称为“渐进式框架”:它是一个可以与你共同成长、适应你不同需求的框架。

MVVM模式

Vue.js使用MVVM(Model-View-ViewModel)模式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mvFMPOAV-1690264748662)(E:\VUE笔记\VUE.assets\image-20230717143837762.png)]

  • Model:数据模型
    • 应用程序的数据,可以从后端获取的数据,也可以是组件自身的数据
  • View:
    • 展示用户界面,即HTML模板部分
  • ViewModel:
    • Vue.js的核心,视图层和数据模型层的中间层,负责建立视图和数据的双向绑定关系

通过MVVM模式,Vue.js实现了数据驱动的开发方式,使开发者能够更专注于业务逻辑的实现,而不用过多关注DOM操作和数据的同步问题。同时,MVVM模式也提高了代码的可维护性和可测试性,使得开发和维护复杂的应用程序更加简单和高效。

搭建Vue开发环境

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-02l5H1fK-1688373083289)(E:\VUE笔记\VUE.assets\image-20230703105459022.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GrMYjRL4-1688373083290)(E:\VUE笔记\VUE.assets\image-20230703105517079.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ag5ZD8C8-1688373083290)(E:\VUE笔记\VUE.assets\image-20230703105537388.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vdHYex5I-1688373083290)(E:\VUE笔记\VUE.assets\image-20230703105653998.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HeKn0Uwx-1688373083291)(E:\VUE笔记\VUE.assets\image-20230703105752548.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dTIWGP9v-1688373083291)(E:\VUE笔记\VUE.assets\image-20230703111030706.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vGdppguX-1688373083292)(E:\VUE笔记\VUE.assets\image-20230703110644806.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jdiaToQE-1688373083292)(E:\VUE笔记\VUE.assets\image-20230703110901721.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NDQXQeqL-1688373083293)(E:\VUE笔记\VUE.assets\image-20230703111014834.png)]

第一个程序

传统的javaScript代码

在Vue.js中,双括号{{}}被用作文本插值的语法,用于在模板中插入动态的数据。

当Vue实例渲染模板时,模板中的{{}}会被替换为实例中对应的数据值。这个过程被称为数据绑定,它建立了视图(View)和模型(Model)之间的联系,使得界面可以随着数据的改变而自动更新。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><!-- 第一步,引入Vue --><script type="text/javascript" src="./js/vue.js"></script></head>
<body><!-- view层 视图层 --><div id="app"><!--{{ }}  :  文本插值的语法,用于在模板中插入动态的数据{{ }} 会被替换为实例中对应的数据值。这个过程被称为数据绑定,它建立了视图(View)和模型(Model)之间的联系,使得界面可以随着数据的改变而更新--><h1>我叫:{{ name }}</h1><h1>年龄:{{ age }}</h1><!-- 可以做运算 --><h1>{{ 1 + 2 + 3 }}</h1><!-- 可以做条件判断 --><h1>{{ 3 > 2 }}</h1><h1>{{ 1 > 2 ? '√' : '×'}}</h1></div><!--传统的javaScript数据呈现到页面的方式对DOM的操作太过繁琐--><!--<script type="text/javascript">var name = "张三";var nameValue = document.getElementById("app")nameValue.textContent = name;</script>--><script>// 创建一个Vue对象var app = new Vue({// element的简写,将Vue示例挂载到id为app的元素上el: '#app',// 数据对象// model层 数据模型// 用于定义组件的初始数据data: {// 定义一个message的属性,并赋值为‘Hello World;name: '张三',age : 18}})</script>
</body>
</html>

Vue常见的属性

  • el
    • 用于指定Vue示例将要挂载到的元素
  • data
    • 用于定义组件的初始数据
  • methods
    • 用于定义组件的方法
  • computed
    • 用于定义计算属性,并在数据变化执行相应的操作
  • watch
    • 用于监听数据的变化,并在数据变化时执行相应的操作
  • props
    • 用于接收父组件传递的数据
  • components
    • 用于注册子组件,使其在父组件中可以使用
  • directives
    • 用于注册自定义指令,可以用于操作DOM 元素
  • filters
    • 用于定义和应用文本格式化的过滤器
  • created
    • 在组件实例被创建后立即调用的钩子函数。
  • mounted
    • 在组件挂载到页面后调用的钩子函数
  • destroyed
    • 在组件被销毁前调用的钩子函数

指令模式

v-bind

用于绑定数据,将Vue实例中的数据绑定到HTML元素的属性上,可以简写为冒号(😃。

例如:v-bind:title=“message”,将Vue实例中的message属性的值绑定到元素的title属性上。

 <!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><!-- 引入Vue --><script type="text/javascript" src="./js/vue.js"></script>
</head>
<body>
<div id="app"><h1>指令语法:</h1><a v-bind:href="url">跳转到CSDN</a>
</div>
<script>// 创建一个Vue实列var app = new Vue({// 将Vue示例挂载到id为app的元素上el: '#app',data: {url : 'https://www.csdn.net'}})
</script>
</body>
</html>

v-model

用于实现双向数据绑定,将表单元素的值与Vue实例中的数据进行双向绑定。

例如:v-model=“message”,将表单元素的值与Vue实例中的message属性进行双向绑定。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>v-model</title><script type="text/javascript" src="./js/vue.js"></script>
</head>
<body>
<div id="app"><h1>v-model指令模式</h1><!--    输入框,使用v-model指令绑定数据--><input type="text" v-model="message" value="请输入"><p>{{ message }}</p><input type="checkbox" v-model="isChecked" ><label>{{ isChecked ? '检查' : '不检查' }}</label><select v-model="selectedOption"><option value=""></option><option value=""></option><option value="rap">rap</option></select><p>选择的选项是: {{ selectedOption }}</p>
</div><script>var vm = new Vue({el: '#app',data: {message: '',isChecked: false,selectedOption: ''}});
</script>
</body>
</html>

v-if / v-else

用于条件渲染,根据表达式的值来决定是否渲染某个元素。

例如:v-if=“isShow”,根据isShow属性的值来决定是否渲染该元素。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>v-if / v-else指令</title><script type="text/javascript" src="./js/vue.js"></script>
</head>
<body>
<div id="app"><h1 v-if="showMessage">Hello, Vue!</h1><h1 v-else>Goodbye, Vue!</h1><button @click="toggleMessage">切换信息</button>
</div><script>// 创建一个Vue实例new Vue({// 将Vue实例挂载到id为app的元素上el: '#app',//数据对象data: {// 控制是否查看消息的变化showMessage: true},// 方法对象啊methods: {// 切换消息显示状态的方法toggleMessage() {//将showMessage的值取反this.showMessage = !this.showMessage;}}});
</script>
</body>
</html>

v-for

用于循环渲染,根据数组或对象的内容来生成多个相同的元素。

例如:v-for=“item in items”,根据items数组的内容来生成多个元素。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>v-for指令</title><script type="text/javascript" src="./js/vue.js"></script>
</head>
<body>
<div id="app"><h1>学生列表</h1><ul><!-- 遍历students数组 --><!-- 遍历数组为students,将每一个元素赋值给变量student --><!-- :key属性用于提供唯一的标识符,以便Vue能够跟踪和优化每一个列表项的更新 --><li v-for="student in students" :key="student.id">{{student.id}}-{{ student.name }} - {{ student.age }}岁</li></ul>
</div>
<script>new Vue({el: '#app',data: {students: [{ id: 1, name: '张三', age: 18 },{ id: 2, name: '李四', age: 20 },{ id: 3, name: '王五', age: 22 },{ id: 4, name: '赵六', age: 19 }]}})
</script>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>v-for指令</title><script type="text/javascript" src="./js/vue.js"></script>
</head>
<body>
<div id="app"><h1>学生列表</h1><ul><!-- 遍历students数组 --><!--students : 要迭代的数组student  : 存储数组的元素的变量名index    : 迭代到的当前元素索引,从0开始--><li v-for="(student,index) in students" :key="student.id">{{index}}-{{student.id}}-{{ student.name }} - {{ student.age }}岁</li></ul>
</div>
<script>new Vue({el: '#app',data: {students: [{ id: 1, name: '张三', age: 18 },{ id: 2, name: '李四', age: 20 },{ id: 3, name: '王五', age: 22 },{ id: 4, name: '赵六', age: 19 }]}})
</script>
</body>
</html>

v-once

v-once指令用于只渲染元素和组件一次,并且之后不再进行重新渲染。这意味着元素或组件的初始状态将会保留,而不会受到后续数据变化的修改

使用v-once指令会提高其性能

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>v-for指令</title><script type="text/javascript" src="./js/vue.js"></script>
</head>
<body>
<div id="app"><h1>{{title}}</h1><a v-for="nav in navs" :href="nav.url" v-once>{{nav.name}}</a>
</div><script src="https://unpkg.com/vue@next"></script>
<script>const vm = Vue.createApp({data() {return {title: 'v-once指令的用法',navs: [{name: '首页', url: 'home.html'},{name: '新闻', url: 'news.html'},{name: '视频', url: 'video.html'},]}}}).mount('#app');
</script>
</body></html>

v-on

用于绑定事件,将Vue实例中的方法绑定到HTML元素的事件上,可以简写为@。

例如:v-on:click=“handleClick”,将Vue实例中的handleClick方法绑定到元素的click事件上。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>v-on指令</title><script type="text/javascript" src="./js/vue.js"></script>
</head>
<body>
<div id="app"><!-- 显示message变量的值 --><h1>{{ message }}</h1><!-- 点击按钮时调用changeMessage方法 --><button v-on:click="changeMessage">改变信息</button>
</div><script>new Vue({// 将Vue实例挂载到id为app的元素上el: '#app',data: {// 定义一个名为message的变量,初始值为'Hello, Vue!'message: 'Hello, Vue!'},methods: {// 定义一个名为changeMessage的方法changeMessage: function() {// 将message的值改为'New Message!'this.message = 'New Message!';}}});
</script>
</body>
</html>

v-show

用于条件显示,根据表达式的值来决定是否显示某个元素,与v-if不同的是,v-show只是通过CSS的display属性来控制元素的显示与隐藏。

例如:v-show=“isShow”,根据isShow属性的值来决定是否显示该元素。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>v-show指令</title><script type="text/javascript" src="./js/vue.js"></script>
</head>
<body>
<div id="app"><!-- 点击按钮时调用toggleShow方法 --><button @click="toggleShow">Toggle Show</button><!-- 根据show的值来决定是否显示该段落 --><p v-show="show">点击按钮时显示这一段</p>
</div><script>new Vue({// 将Vue实例挂载到id为app的元素上el: '#app',data: {// 初始化show的值为false,即不显示该段落show: false},methods: {// 定义toggleShow方法toggleShow() {// 切换show的值,如果为true则变为false,如果为false则变为truethis.show = !this.show;}}});
</script>
</body>
</html>

组件

Vue组件是Vue.js框架中的核心概念之一,可以应用程序划分为几个独立,可重复的模块。每个组件包含了相关的HTML模板,CSS样式和JavaScript代码,用于构建用户界面。

在Vue中,组件是可复用的自定义元素,通过Vue示例的components选项来注册,一旦注册了组件,就可以在其他的组件和应用程序作用使用。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>v-show Directive Example</title><script type="text/javascript" src="./js/vue.js"></script>
</head>
<body><div id="app"><sin></sin></div><script type="text/javascript">/*** 全局注册组件:在所有的Vue实例中都可可以使用组件* 参数1:组件名称,参数2:具体的组件*  Vue.component("sin",{template:'<h1>hello!!!</h1>',});*///定义组件const countertemp = {template: `<button @click='num++'>点击了{{num}}</button>`,data(){return{num:0}}};var vm = new Vue({el: "#app",//局部组件注册:只能在当前Vue示例中使用components:{//组件名称:具体组件sin: countertemp}});</script></body>
</html>

Axios

Axios提供了一种简介且易于使用的方式来处理一步HTTP请求,并自动转换响应数据为JavaScript对象。她支持各种请求方法,例如:GET,POST,PUT,DELETE等,并提供了许多配置选项,例如请求头,发送请求参数,处理错误等。

在Vue中,可以使用Axios来与后端API进行通信,获取数据并更新页面。

在Vue组件中导入Axios,并在需要的地方发起HTTP请求。

官网:https://www.axios-http.cn/

configData.json

{"name": "SIN","url": "https://www.baidu.com/","page": 1,"method": "get","isNonProfit": true,"address": {"street": "雁塔区","city": "陕西西安","country": "中国"},"links": [{"name": "sin","url": "https://blog.csdn.net/qq_44715376?type=blog"}]
}

html页面

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>v-show Directive Example</title><!-- 导入相关文件--><script type="text/javascript" src="./js/vue.js"></script><script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script><script src="https://unpkg.com/axios/dist/axios.min.js"></script>
</head>
<body><div id="vue"></div><script>var vm = new Vue({el: '#vue',//钩子函数,程序执行的时候插入到Vue的整个生命周期的任意位置执行mounted(){//get请求axios.get('configData.json').then(response=>(console.log(response.data)));}});</script></body>
</html>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Op3eQbm3-1690264809557)(E:\VUE笔记\VUE.assets\image-20230717172938683.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FxPPQTZA-1690264809558)(E:\VUE笔记\VUE.assets\image-20230717172702311.png)]

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Title</title><!-- 导入相关文件--><script type="text/javascript" src="./js/vue.js"></script><script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script><script src="https://unpkg.com/axios/dist/axios.min.js"></script>
</head>
<body><div id="vue">{{info.name}}{{info.address}}<a v-bind:href="info.url">点击跳转</a></div><script>var vm = new Vue({el: '#vue',data(){return{// 请求的返回参数合适,必须喝json字符串一样info: {name: null,url: null,address:{street: null,city: null,country: null},links:[{name: null,url:null}]}}},//钩子函数,程序执行的时候插入到Vue的整个生命周期的任意位置执行mounted(){//get请求axios.get('configData.json').then(response=>(this.info=response.data));}});</script>
</body>
</html>

计算属性

Vue计算属性(Computed properties)是一种特殊的计算属性,它们不是组件的data属性,二十依赖于data属性并根据它们计算出来的,计算属性的值会根据所依赖的数据项进行缓存,并在相关数据项发生改变时自动更新。这使得计算属性在性能和代码组织上都有优势,它可以让你用简洁的方式处理复杂的逻辑操作

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Title</title><!-- 导入相关文件--><script type="text/javascript" src="./js/vue.js"></script></head>
<body>
<!-- Vue应用的挂载点,id为"app" -->
<div id="app"><!-- 使用v-model指令与Vue实例中的firstName和lastName进行双向数据绑定 --><input type="text" v-model="firstName"><input type="text" v-model="lastName"><!-- 使用插值表达式直接访问计算属性fullName的值 --><!-- 当firstName或lastName的值发生变化时,fullName的值会自动更新 --><p>Full Name: {{ fullName }}</p>
</div><!-- 定义Vue实例 -->
<script>new Vue({el: '#app',  // Vue实例挂载的元素data: {firstName: "",  // data中定义的firstName属性lastName: ""    // data中定义的lastName属性},computed: {fullName() {// 计算属性fullName的值依赖于firstName和lastName的值// 当firstName或lastName的值发生改变时,fullName的值会自动更新return this.firstName + ' ' + this.lastName;}}});
</script></body>
</html>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P7MWETtt-1690264809558)(E:\VUE笔记\VUE.assets\image-20230718103853771.png)]

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Title</title><!-- 导入相关文件--><script type="text/javascript" src="./js/vue.js"></script></head>
<body>
<!-- Vue应用的挂载点,id为"app" -->
<div id="app"><!-- 使用v-model指令与Vue实例中的firstName和lastName进行双向数据绑定 --><input type="text" v-model="num1">+<input type="text" v-model="num2"><!-- 使用插值表达式直接访问计算属性fullName的值 --><!-- 当firstName或lastName的值发生变化时,fullName的值会自动更新 --><p>sum: {{ sum }}</p>
</div><!-- 定义Vue实例 -->
<script>new Vue({el: '#app',  // Vue实例挂载的元素data: {num1: "",  // data中定义的firstName属性num2: ""    // data中定义的lastName属性},computed: {sum() {const n1 = parseFloat(this.num1)||0;const n2 = parseFloat(this.num2)||0;return n1 + n2;}}});
</script></body>
</html>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0uK7gnMn-1690264809561)(E:\VUE笔记\VUE.assets\image-20230718104203753.png)]

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Title</title><!-- 导入相关文件--><script type="text/javascript" src="./js/vue.js"></script></head>
<body><div id="vue"><p>currnetTime1  {{currentTime1()}}</p><p>currentTime2  {{currentTime2}}</p></div><script>var vm = new Vue({el: "#vue",methods:{// currentTime1方法currentTime1:function () {//返回现在的时间戳return Date.now();}},//计算属性,methods,computed方法名不能重写,重名之后,只会调用Methods的方法computed:{currentTime2: function () {return Date.now();}}});</script>
</body>
</html>

注意:

​ methods和computed里的东西不能重名

说明:

  • methods:定义方法,调用方法使用currentTime1(),需要带括号
  • cumputed:定义计算属性,调用属性使用currentTime2,不需要带括号

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M2pdGgQO-1690264809562)(E:\VUE笔记\VUE.assets\image-20230718100255985.png)]

插槽Slot

Vue中的插槽(Slot)是一种非常重要的内容分发技术,它允许我们在组件模板中定义一些占位符,然后再使用组件的地方填充这些占位符。

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Title</title><script type="text/javascript" src="./js/vue.js"></script>
</head><body><div id="app"><todo><!--通过slot="todo-title"将其放置在todo组件的todo-title插槽中通过:title属性传递一个标题--><todo-title slot="todo-title" :title="title"></todo-title><!--通过slot="todo-items"将多个列表项放置在todo组件中的todo-itmes插槽中通过v-for指令遍历todoItems数组中的每一项--><todo-items slot="todo-items" v-for="item in todoItems" :item="item"></todo-items></todo></div><script>/*** Vue实现简单的列表* 包好三个自定义组件todo,todo-title,todo-items。**/Vue.component("todo",{template: '<div>\<slot name="todo-title"></slot>\<ul>\<slot name="todo-items"></slot>\</ul>\</div>'});/*** 列表的标题*/Vue.component("todo-title",{props: ['title'],template: '<div>{{title}}</div>'});/*** 列表项*/Vue.component("todo-items",{props:['item'],template: '<li>{{item}}</li>'});var vm = new Vue({el: "#app",//定义的数据data: {title: "你好",todoItems: ['张三','李四','王五']}});</script></body></html>

最终所渲染的结果:

<div id="app"><div><div>你好</div><ul><li>张三</li><li>李四</li><li>王五</li></ul></div>
</div>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WkqLw8hb-1690264809563)(E:\VUE笔记\VUE.assets\image-20230718165616844.png)]

总结:

​ 这个简单的列表项,通过使用Vue.js的插槽功能,我们可以将内容分发到响应的插槽中进行指定和重用。

img

相关文章:

前端框架Vue

Vue 学习路线 学习HTML、CSS和JavaScript基础知识&#xff1a;Vue是基于JavaScript的框架&#xff0c;所以首先需要掌握HTML、CSS和JavaScript的基础知识&#xff0c;包括DOM操作、事件处理、变量和函数等。 学习Vue的基本概念&#xff1a;了解Vue的核心概念&#xff0c;如Vu…...

基于Servlet实现的管理系统(包含服务器源码+数据库)

资料下载链接 介绍 基于Servlet框架的管理系统 简洁版 &#xff1b; 实现 登录 、 注册 、 增 、 删 、 改 、 查 &#xff1b; 可继续完善增加前端、校验、其他功能等&#xff1b; 可作为 Servlet项目 开发练习基础模型&#xff1b; 课程设计 、 毕业设计 开发基础&…...

Android JUnit测试完成程序自动退出决方法

对于一些Android JUnit测试的开发人员来说&#xff0c;程序自动退出是一个经常面临的困扰。下面从多个方面给出解决方法。 一、检查测试代码 首先&#xff0c;我们应该仔细检查我们的测试代码&#xff0c;确保它没有错误导致程序退出。我们可以使用调试工具来帮助我们找出错误…...

【FAQ】安防监控视频云存储平台EasyNVR频繁离线的原因排查与解决

有用户反馈&#xff0c;在使用EasyNVR时会出现通道频繁离线的情况。针对该反馈我们立即进行了排查。 安防视频监控汇聚EasyNVR视频集中存储平台&#xff0c;是基于RTSP/Onvif协议的安防视频平台&#xff0c;可支持将接入的视频流进行全平台、全终端分发&#xff0c;分发的视频流…...

ClickHouse(二十二):Clickhouse SQL DML操作及导入导出数据

进入正文前&#xff0c;感谢宝子们订阅专题、点赞、评论、收藏&#xff01;关注IT贫道&#xff0c;获取高质量博客内容&#xff01; &#x1f3e1;个人主页&#xff1a;含各种IT体系技术&#xff0c;IT贫道_Apache Doris,大数据OLAP体系技术栈,Kerberos安全认证-CSDN博客 &…...

Vue 2自定义指令入门

Vue 2自定义指令入门 Vue自定义指令允许我们在DOM元素上添加自己想要的行为来扩展Vue的功能。 一个自定义指令需要一个名称和一个定义对象。在定义对象中&#xff0c;你可以使用一些钩子函数来控制指令的行为&#xff1a; bind&#xff1a;在指令被绑定到元素上时使用&#…...

【Sklearn】基于AdaBoost算法的数据分类预测(Excel可直接替换数据)

【Sklearn】基于AdaBoost算法的数据分类预测(Excel可直接替换数据) 1.模型原理2.模型参数3.文件结构4.Excel数据5.下载地址6.完整代码7.运行结果1.模型原理 AdaBoost(Adaptive Boosting)是一种集成学习算法,它通过组合多个弱分类器来构建一个更强大的分类器。下面是AdaBo…...

Docker+Selenium Grid搭建自动化测试平台

安装docker yum install -y yum-utils device-mapper-persistent-data lvm2 yum-config-manager –add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo yum install docker-ce -y Create a Docker Network docker network create grid 下载镜像 hu…...

Django图书商城系统实战开发-总结经验之后端开发

Django图书商城系统实战开发-总结经验之后端开发 简介 在这篇博客中&#xff0c;我将总结经验分享后端开发Django图书商城系统的过程。在开发过程中&#xff0c;我遇到了各种挑战和问题&#xff0c;并且通过实践获得了宝贵的经验和教训。通过本文&#xff0c;我希望能帮助读者…...

LeetCode[1288]删除被覆盖区间

难度&#xff1a;Medium 题目&#xff1a; 给你一个区间列表&#xff0c;请你删除列表中被其他区间所覆盖的区间。 只有当 c < a 且 b < d 时&#xff0c;我们才认为区间 [a,b) 被区间 [c,d) 覆盖。 在完成所有删除操作后&#xff0c;请你返回列表中剩余区间的数目。 示…...

QT connect使用简单介绍

如图&#xff0c;首先 connect是线程安全的。其次它有很多重载&#xff0c;当然最重要的还是QT4连接和QT5连接的区别&#xff0c;这个函数重载表示connect函数也是支持lambda函数的。 connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)connec…...

【云原生】kuberneter中Helm入门到实践

引言 helm是k8s的包管理工具&#xff0c;使用helm&#xff0c;可以使用更为简化和系统化的方式对k8s应用进行部署、升级。 helm是CNCF已毕业的项目&#xff0c;社区也是相当活跃的&#xff0c;在 https://artifacthub.io/ 上&#xff0c;能找到很多现成的helm chart&#xff…...

编译鸿蒙codelabs安装时报错

学习鸿蒙ArkTS时编译codelabs样例代码&#xff0c;发现编译完成报错。目前鸿蒙的资料比较少&#xff0c;且官方文档路径很深&#xff0c;遂记录下来&#xff0c;以资来者。 error: failed to start ability. Error while Launching activity修改module.json5中的exported为tru…...

设计模式

本文主要介绍设计模式的主要设计原则和常用设计模式。 一、UML画图 1.类图 2.时序图 二、设计模式原则 1.单一职责原则 就是一个方法、一个类只做一件事&#xff1b; 2.开闭原则 就是软件的设计应该对拓展开放&#xff0c;对修改关闭&#xff0c;这在java中体现最明显的就…...

用gdal库读取tif影像并填充边缘,并根据窗口大小滑动裁剪裁剪(包含gdal转PIL)

相关文章 PIL&#xff0c;OPENCV之间的转换关系_pil cvtcolor(image)_番茄就要炒鸡蛋的博客-CSDN博客 python GDAL和PIL图像转换_gdal.readasarray和pil_llc的足迹的博客-CSDN博客 一、原始数据 二、分别读取数据 1、gdal读取的array 2、pil读取的array 三、 gdal转pil image …...

sqlserver数据库导出到mysql

爱到分才显珍贵&#xff0c;很多人都不懂珍惜拥有&#xff0c;只到失去才看到&#xff0c;其实那最熟悉的才最珍贵的。 这里只介绍一种方式&#xff0c;有很多的方式。 1.使用Navicat 安装 下载 2.工具 数据传输 3.选择源和目标 然后开始 4.最好导入前备份一下库...

【抓包工具】whistle抓包工具分享

一、使用场景 抓包请求转发 二、基础篇 官网&#xff1a;http://wproxy.org/whistle/ github: https://github.com/avwo/whistle 简介&#xff1a; whistle(读音[ˈwɪsəl]&#xff0c;拼音[wēisǒu])基于Node实现的跨平台web调试代理工具&#xff0c;类似的工具有Window…...

docker可视化工具Portainer

1:Portainer简介 Portainer是一个docker可视化管理工具&#xff0c;可以非常方便地管理docker镜像容器。官网地址&#xff1a;https://www.portainer.io/ 注&#xff1a;现在Portainer有BE&#xff08;收费&#xff09;和CE&#xff08;免费&#xff09;版本&#xff0c;安装的…...

售后服务管理系统哪家好?云部署的售后服务软件有什么优势?

如今&#xff0c;越来越多的企业开始利用数字化系统来监控他们建造、操作或维护的高科技设备的技术属性。然而&#xff0c;仍然有很多公司依赖于孤立的低技术解决方案&#xff0c;比如使用Excel电子表格和手动流程来管理工作。当然&#xff0c;对于一家公司来说&#xff0c;寻找…...

laravel-admin之 解决上传图片不显示 $form->image(‘image‘); 及 $grid->column(‘image‘);

参考 https://blog.csdn.net/u013164285/article/details/106017464 $grid->column(‘image’)->image(‘http://wuyan.cn’, 100, 100); // //设置服务器和宽高 图片上传的域名 上传的图片不显示 在 这里设置了图片的上传路径 在这里设置 域名 就可以回显图片...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下&#xff0c;越来越多的求职者将目光投向了日本及中日双语岗位。但是&#xff0c;一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧&#xff1f;面对生疏的日语交流环境&#xff0c;即便提前恶补了…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况&#xff0c;可以通过以下几种方式模拟或触发&#xff1a; 1. 增加CPU负载 运行大量计算密集型任务&#xff0c;例如&#xff1a; 使用多线程循环执行复杂计算&#xff08;如数学运算、加密解密等&#xff09;。运行图…...

微信小程序云开发平台MySQL的连接方式

注&#xff1a;微信小程序云开发平台指的是腾讯云开发 先给结论&#xff1a;微信小程序云开发平台的MySQL&#xff0c;无法通过获取数据库连接信息的方式进行连接&#xff0c;连接只能通过云开发的SDK连接&#xff0c;具体要参考官方文档&#xff1a; 为什么&#xff1f; 因为…...

如何在最短时间内提升打ctf(web)的水平?

刚刚刷完2遍 bugku 的 web 题&#xff0c;前来答题。 每个人对刷题理解是不同&#xff0c;有的人是看了writeup就等于刷了&#xff0c;有的人是收藏了writeup就等于刷了&#xff0c;有的人是跟着writeup做了一遍就等于刷了&#xff0c;还有的人是独立思考做了一遍就等于刷了。…...

Java毕业设计:WML信息查询与后端信息发布系统开发

JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发&#xff0c;实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构&#xff0c;服务器端使用Java Servlet处理请求&#xff0c;数据库采用MySQL存储信息&#xff0…...

Linux 中如何提取压缩文件 ?

Linux 是一种流行的开源操作系统&#xff0c;它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间&#xff0c;使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的&#xff0c;要在 …...

LabVIEW双光子成像系统技术

双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制&#xff0c;展现出显著的技术优势&#xff1a; 深层组织穿透能力&#xff1a;适用于活体组织深度成像 高分辨率观测性能&#xff1a;满足微观结构的精细研究需求 低光毒性特点&#xff1a;减少对样本的损伤…...

PHP 8.5 即将发布:管道操作符、强力调试

前不久&#xff0c;PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5&#xff01;作为 PHP 语言的又一次重要迭代&#xff0c;PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是&#xff0c;借助强大的本地开发环境 ServBay&am…...

WebRTC从入门到实践 - 零基础教程

WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC&#xff1f; WebRTC&#xff08;Web Real-Time Communication&#xff09;是一个支持网页浏览器进行实时语音…...