Vue.directive('指令名', {
inserted (el) {
// 处理逻辑代码
}
})
directives: {
loading: {
//inserted函数是指令所绑定的元素在被插入到页面时触发的
inserted(el,binding) {
// el为绑定的元素,binding.value为指令的值
binding.value ? el.classList.add('loading') : el.classList.remove('loading')
},
//update函数是指令的值在被修改之后触发的
update(el,binding) {
binding.value ? el.classList.add('loading') : el.classList.remove('loading')
}
}
}
```css
.loading::before {
content: '';
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
background: #fff url('./loading.gif') no-repeat center;
}
```
```javascript
directives: {
loading: {
inserted(el,binding) {
binding.value ? el.classList.add('loading') : el.classList.remove('loading')
},
update(el,binding) {
binding.value ? el.classList.add('loading') : el.classList.remove('loading')
}
}
}
```
<template>
<div>
<MyDialog>
<template v-slot:header>
<p>友情提示</p>
</template>
<template v-slot:content>
<p>确定要删除么</p>
</template>
<template #footer>
<button>确定</button>
<button>取消</button>
</template>
</MyDialog>
<MyDialog>
<template v-slot:header>
<p>警告</p>
</template>
<template v-slot:content>
<p>不可以删除</p>
</template>
<template #footer>
<button>取消</button>
</template>
</MyDialog>
</div>
</template>
// 1. 在slot标签上,通过添加属性的方式给上层组件传值
<tr v-for="(item,index) in data" :key="item.id">
<td>{{ index + 1 }}</td>
<td>{{ item.name }}</td>
<td>{{ item.age }}</td>
<td>
<slot :id="item.id" msg="测试文本"></slot>
</td>
</tr>
// 2. 组件通过#插槽名=变量名获取slot传递的对象值
<MyTable :data="list">
<template #default="obj">
<button @click="del(obj.id)">删除</button>
</template>
</MyTable>
单页应用程序:只有一个html文件,应用通过路由进行组件的切换。而多页应用程序则有多个html文件,是页面之间进行切换。
在Vue中,路由就是组件与路径的映射关系。通过vue内置的插件vue-router来实现。
const router = new VueRouter({
routes: [
{path: '/findmusic', component: FindMusic},
{path: '/myfriend', component: MyFriend},
{path: '/mymusic', component: MyMusic}
]
})
<template>
<div>
<div class="footer_wrap">
<a href="#/findmusic">发现音乐</a>
<a href="#/mymusic">我的音乐</a>
<a href="#/myfriend">朋友</a>
</div>
<div class="top">
<router-view></router-view>
</div>
</div>
</template>
组件分类
VueRouter中内置全局组件router-link,可以代替a标签进行跳转,并且可以实现标签高亮。
router-link通过添加类名的方式来实现高亮,有两种方式:
跳转传参:
<!-- 配置路径 -->
<div class="hot-link">
热门搜索:
<router-link to="/search?key=黑马程序员">黑马程序员</router-link>
<router-link to="/search?key=前端培训">前端培训</router-link>
<router-link to="/search?key=如何成为前端大牛">如何成为前端大牛</router-link>
</div>
<!-- 获取参数 -->
<p>搜索关键字: {{ $route.query.key}} </p>
<!-- 配置动态路由 -->
const router = new VueRouter({
routes: [
{ path: '/home/:words', component: Home },
<!-- 动态路由参数可选符?,表示参数可填可不填,避免没有参数时页面显示空白 -->
{ path: '/search/:words?', component: Search }
]
})
<!-- 配置路径 -->
<div class="hot-link">
热门搜索:
<router-link to="/search/黑马程序员">黑马程序员</router-link>
<router-link to="/search/前端培训">前端培训</router-link>
<router-link to="/search/如何成为前端大牛">如何成为前端大牛</router-link>
</div>
<!-- 获取参数 -->
<p>搜索关键字: {{ $route.params.words}} </p>
路由重定向&404&路由模式设置
const router = new VueRouter({
// 路由模式选择分为hash和history。history模式下,路径没有#
mode: 'history',
routes: [
// 路由重定向
{ path: '/', redirect: '/home'},
{ path: '/home', component: Home },
{ path: '/search/:words?', component: Search },
// 404路由设置,必须放在最后
{ path: '*', component: NotFound}
]
})
methods: {
handleSearch() {
// 简便写法
// 查询参数方式
this.$router.push(`/search?input=${ this.input }`)
// 动态路由方式
this.$router.push(`/search/${this.input}`)
// 完整写法
// 查询参数方式
this.$router.push({
path: '/search',
query: {
input: this.input
}
})
// 动态路由方式
this.$router.push({
path: `/search/${this.input}`,
})
}
}
this.$router.push({
name: 'search',
// 查询参数方式
query: {
input: this.input
},
// 动态路由方式
params: {
words: this.input
}
})
const router = new VueRouter({
routes: [
{
path: '/',
component: Layout,
redirect: '/article',
// 二级路由
children: [
{
path: '/article',
component: Article
},
{
path: '/collect',
component: Collect
},
{
path: '/like',
component: Like
},
{
path: '/user',
component: User
},
]
},
{
path: '/detail/:id',
component: ArticleDetail
}
]
})