一、知识点
1、vue组件
什么是组件: 组件的出现,就是为了拆分Vue实例的代码量的,能够让我们以不同的组件,来划分不同的功能模块,将来我们需要什么样的功能,就可以去调用对应的组件即可。
组件化和模块化的不同:
模块化:是从代码逻辑的角度进行划分的;方便代码分层开发,保证每个功能模块的职能单一
组件化:是从UI界面的角度进行划分的;前端的组件化,方便UI组件的重用
1.1 全局组件定义的四种方式
1.使用 Vue.extend 配合 Vue.component 方法
var login = Vue.extend({ template: '<h1>登录</h1>' }); Vue.component('login', login);
2.直接使用 Vue.component 方法:
Vue.component('register', { template: '<h1>注册</h1>' });
3.将模板字符串,定义到script标签中:
<script id="tmpl" type="x-template"> <div><a href="#">登录</a> | <a href="#">注册</a></div> </script>
同时,需要使用 Vue.component 来定义组件:
Vue.component('account', { template: '#tmpl' });
4.将模板字符串,定义到template标签中:
< template id="tmpl"> <div><a href="#">登录</a> | <a href="#">注册</a></div> </ template >
同时,需要使用 Vue.component 来定义组件:
Vue.component('account', { template: '#tmpl' });
注意:组件中的DOM结构,有且只能有唯一的根元素(Root Element)来进行包裹!
1.2 组件中展示数据和响应事件
在组件中,data需要被定义为一个方法,例如:
Vue.component("son4", { template: "#son4", son5, //为什么组件中的data属性必须定义为一个方法并返回一个对象 // 目的:数据隔离,互不影响 data() { return { msg: 'hello', list: [4, 5, 6, 7, 8] } }, methods: { } })
1.3 使用components属性定义局部子组件
组件实例定义方式:
<script> // 创建 Vue 实例,得到 ViewModel var vm = new Vue({ el: '#app', data: {}, methods: {}, components: { // 定义子组件 account: { // account 组件 template: '<div><h1>这是Account组件{{name}}</h1><login></login></div>', // 在这里使用定义的子组件 components: { // 定义子组件的子组件 login: { // login 组件 template: "<h3>这是登录组件</h3>" } } } } }); </script>
引用组件:
<div id="app"> <account></account> </div>
使用flag标识符结合v-if和v-else切换组件
页面结构:
<div id="app"> <input type="button" value="toggle" @click="flag=!flag"> <my-com1 v-if="flag"></my-com1> <my-com2 v-else="flag"></my-com2> </div>
Vue实例定义:
<script> Vue.component('myCom1', { template: '<h3>奔波霸</h3>' }) Vue.component('myCom2', { template: '<h3>霸波奔</h3>' }) // 创建 Vue 实例,得到 ViewModel var vm = new Vue({ el: '#app', data: { flag: true }, methods: {} }); </script>
1.4 使用:is属性来切换不同的子组件,并添加切换动画
组件实例定义方式:
// 登录组件 const login = Vue.extend({ template: `<div> <h3>登录组件</h3> </div>` }); Vue.component('login', login); // 注册组件 const register = Vue.extend({ template: `<div> <h3>注册组件</h3> </div>` }); Vue.component('register', register); // 创建 Vue 实例,得到 ViewModel var vm = new Vue({ el: '#app', data: { comName: 'login' }, methods: {} });
使用component标签,来引用组件,并通过:is属性来指定要加载的组件:
<div id="app"> <a href="#" @click.prevent="comName='login'">登录</a> <a href="#" @click.prevent="comName='register'">注册</a> <hr> <transition mode="out-in"> <component :is="comName"></component> </transition> </div>
添加切换样式:
<style> .v-enter, .v-leave-to { opacity: 0; transform: translateX(30px); } .v-enter-active, .v-leave-active { position: absolute; transition: all 0.3s ease; } h3{ margin: 0; } </style>
1.5 父组件传值子组件
接受父组件传值
设置props属性就可以接受父组件传值
示例:
// html部分 <son :parent-msg='msg' :list='list'></son> <template id='myComTemp'> <div> <button @click='changeMsg'>修改parentMsg</button> <h1>你好{{parentMsg}}</h1> <ul> <li v-for='item in list'>{{item.name}}</li> </ul> </div> </template>
// 组件定义部分 var vm = new Vue({ el: '#app', components: { son: { template: '#myComTemp', // 定义父组件传过来的值 props: ['parentMsg', 'list'] } } }
设置传递类型
props: { // 规定了父组件只能传对象类型 prop1:Object // 可以设置多个类型,可以传Number也可以传String parentMsg: [Number, String], list: { // 设置类型 type: Array,// [Array,String] // 设置默认值的时候必须使用函数,原理和data必须使用函数是一样的 default: function () { return [{ name: '这个一个默认的名字' }] } }, }
2.slot插槽
2.1插槽的使用
<template id="course"> <div> <!-- 插槽 --> <h2> <slot></slot> </h2> <ul> <li v-for="(item,index) in courseList" :key="index"> <img :src="item.coverFileUrl" alt=""> <div>{{item.courseTitle}}</div> <div>免费</div> </li> </ul> </div> </template>
2.2插槽的使用 - 具名插槽
<template v-slot:footer> <div> 课程底部 </div> </template> <template v-slot:header> <div> 课程顶部 </div> </template> <template id="course"> <div> <!-- 插槽 --> <h2> <slot></slot> <slot name="header"></slot> </h2> <ul> <li v-for="(item,index) in courseList" :key="index"> <img :src="item.coverFileUrl" alt=""> <div>{{item.courseTitle}}</div> <div>免费</div> </li> </ul> <!-- 具名插槽 --> <h2> <slot name="footer"></slot> </h2> </div> </template>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具