指令:对于底层DOM操作的一种封装
封装在指令里面可以进行复用
<div id="box">
<div v-hello=" 'red' ">div>
<div>
<script>
//自定义指令
//inserted第一个参数得到的就是这个元素,第二个参数是元素对象
Vue.directive("hello",{
//指令的生命周期
inserted(el,binding){
//第一次插入到父节点是触发
el.style.background =binding。value
},
update(){
}
})
new Vue ({
el="box"
})
script>
Vue.directive("指令名",{})
在定义指令
在dom创建好之后就会触发简写指令
Vue.directive("hello",(el,binding)=>{
el.style.background=binding.value
})
指令生命周期:
bind
:只调用一次,指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置。inserted
∶被绑定元素插入父节点时调用(仅保证父节点存在,但不一定已被插入文档中)。upiate
:所在组件的VNode更新时调用,但是可能发生在其子VNode更新之前。指令的值componentUpdated
∶指令所在组件的VNode及其子VNode全部更新后调用。unbind
(销毁) :只调用一次,指令与元素解绑时调用。在Vue3中,指令的生命周期发生变化
nextTick
updated
执行的都完,只执行一次this.$nextTick(()=>{
},2000)
在原来的文件中写Vue
可以使用.vue
文件
文件扩展名为 .vue 的 single-file components (单文件组件) 为以上所有问题提供了解决方法,并且还可以使用 webpack 或 Browserify 等构建工具。
.vue
文件,浏览器不认识有了 .vue
组件,我们就进入了高级 JavaScript 应用领域。如果你没有准备好的话,意味着还需要学会使用一些附加的工具:
Node Package Manager (NPM):阅读 Getting Started guide 中关于如何从注册地 (registry) 获取包的章节。
Modern JavaScript with ES2015/16:阅读 Babel 的 Learn ES2015 guide。你不需要立刻记住每一个方法,但是你可以保留这个页面以便后期参考。
在你花一天时间了解这些资源之后,我们建议你参考 Vue CLI 3。只要遵循指示,你就能很快地运行一个带有 .vue
组件、ES2015
、webpack
和热重载 (hot-reloading)
的 Vue 项目!
packgae.json
文件中直接运行脚本packgae.json
文件的集成终端直接运行
npm run serve
或着npm start
来启动App.vue
文件进入解决方案:
npm run lint
vue.config.js
文件中添加以下代码module.export = {
lintOnSave: false//暂时关闭代码格式检测
}
npm run lint
template
标签下export default{}
style
标签写css,不需要写道行内.vue
文件在里面写组件的内容import 子组件名 from '子组件文件的地址'
引入Vue.component('子组件名' , 子组件文件名)
import Vue from 'vue'
来引入一次components:{ 子组件名 }
style
标签中加scoped
就可以防止被覆盖style
加上long:"scss"
就能使用scss
的写法npm i --save axios
指令
import Vue from 'vue'
过滤器
Vue.filter("过滤器名称",()=>{需要修改的操作})
声明即可用devServer: {
port : 8000,//随便改端口号
proxy : {
'/api' : {
target: 'https ://*.*.com' ,//需要代理的网站
host: '*.*.com ' ,
changeOrigin :true,
pathRewrite:{
'自定义接口的名字':''//将自定义接口的名字转为空字符串
}
}
}
}
'/api'
相同在vue文件中 @
为别名,永远指向src绝对路径
,在src下面引入文件时,只需要加@
就能引入里面文件的绝对路径
SPA概念
单页面应用(SinglePage Web Application ,SPA) | 多页面应用(MultiPage Application, MPA) | |
---|---|---|
组成 | 一个外壳页面和多个页面片段组成 | 多个完整页面构成 |
资源公共(css js) | 公用,只需要在外壳部分加载 | 不共用,每个页面都需要加载 |
刷新方式 | ||
url模式 | a.com/#/pageone a.com/#/pagetwo | a.com/pageone.html a.com/pagetwo.html |
用户体验 | 页面片段间的切换快,用户体验良好 | 页面切换加载缓慢,流畅度不够,用户体验比较差 |
转场动画 | 容易实现 | 无法实现 |
数据传递 | 容易 | 依赖url传参、或者cookie .localStorage等 |
搜索引擎优化(SEO) | 需要单独方案,实现比较困难,不利于SEO检索 可利用服务器端渲染(SSR)优化 | 实现方法简易 |
试用范围 | 高要求的体验度,追求界面流畅的应用 | 适用于追求高度支持搜索引擎的应用 |
开发成本 | 较高,常常需要借助专业的框架 | 较低,但页面重复代码多 |
维护成本 | 相对容易 | 相对复杂 |
vue-router
在main.js
先引入router文件,并且将给文件渲染
再创建几个组件
在路由文件(index.js)中引入组件
import 组件名称 from '组件相对地址'
Vue.ues(VueRouter)//注册路由插件,两个全局router-view router-link
const routes =[
{
path:'/组件名',
component:组件名称
}//有几个组件就写几次
]
const router =new VueRouter({
routes
})
export default router
在根文件中加上router-view
标签相当于slot
标签
const routes =[
{
path:'/组件名',
component:组件名称
},
{
path:'/',
redirection:'/组件名'
}
]
这样操作即可
const routes =[
{
path:'*',
component:组件名称
},
{
path:'*',
redirection:'/组件名'
}
]
第一种方法
标签进行跳转组件(使用to="组件绝对地址")
时,会自动给跳转的组件加上class,可以通过给这个class加上高亮属性,来使得点击某个图标跳转之后可以使得该图标保持高亮active-class="class名称"
的方式添加第二种方法
标签进行跳转组件(使用to="组件绝对地址")
,在这个标片中间再加一个
标签,在存放组件
标签中加custom v-slot="{navigate,isActive}"
属性
标签上@事件="navigate"
属性isActive
是判断是否在当前组件上,是的话就是true,否则是false,可以通过这一特性,添加动态class
:class="isActive?自定义属性:''"
import 组件名称 from '组件相对地址'
import 子组件名称 from '子组件相对地址'
Vue.ues(VueRouter)//注册路由插件,两个全局router-view router-link
const routes =[
{
path:'/组件名',
component:组件名称,
children:[
{
path:'/组件名/子组件名',
component:子组件名称,
}
]
}
]
const routes =[
{
path:'/组件名',
component:组件名称,
children:[
{
path:'/组件名/子组件名',
component:子组件名称,
}
{
path:'*',
redirect:'/组件名/子组件名'
}
]
}
]
location.href = '#/组件名'
,使其跳转到那个组件页面this.$router.push('/组件名')
,使其跳转到那个组件页面在路由文件中设置一个动态路由
const routes =[
{
path:'/组件名/:id',//通过id来获取组件
component:组件名称
}
]
在改组件中设置this.$route.params.id
来获取id值,发送请求到后端
在根组件中设置点击事件后,设置一个函数,参数就是id
,通过this.$router.push(/组件名称/${id})
的方式,使得创建一个组件
name
属性const routes =[
{
name:'asd'
path:'/组件名/:id',//通过id来获取组件
component:组件名称
}
]
函数名(参数){
this.$router.push({
name:'asd',
params:{
id:参数
}
})
}
#
,可以使用history模式
#
,使用这种模式不影响mode:'history'
即可const router =new VueRouter({
mode:'history'
routes
})
弊端
http: //oursite.com/user/id
就会返回404,这就不好看了。如果出现了问题,就使用npm run build
生成了dist文件夹,仍给后端
在一些页面不授权不给进入
可以给路由加上一个meta
属性,在里面自定义一个属性,自定义属性值为true
meta:{
isASD:true
}
router.beforeEach((to,from,next)=>{
if(某几个需要授权的路由/*to.meta.isASD==>通过判断这个值是不是true来进行判断是否通过*/){
//判断本地储存中是否有token字段
if(localStorage.getItem('token')/*授权通过*/){
next()
}else{
next('/login')
}
}else{
next()
}
})
router.beforeEach((to,from,next)=>{
if(某几个需要授权的路由/*to.meta.isASD==>通过判断这个值是不是true来进行判断是否通过*/){
//判断本地储存中是否有token字段
if(localStorage.getItem('token')/*授权通过*/){
next()
}else{
next('/login')
}
}else{
next({
path:'/login',
query:{redirect:to.fullPath}
})
}
})
跳转路由的代码
this.$router.push(this.$route.query.redirect)
beforeEach((to,from,next)=>{}
// 路由生命周期
beforeRouteEach((to,from,next)=>{
//在渲染该组件的对应路由被·confirm·前调用·
//不!能!获取组件实例`this`
//因为当守卫执行前,组件实例还没被创建
}
当打包构建应用时,JavaScript 包会变得非常大,影响页面加载。如果我们能把不同路由对应的组件分割成不同的代码块,然后当路由被访问的时候才加载对应组件,这样就会更加高效。
import 组件名称 from '组件相对地址'
再在组件内部替换一条语句
{
path:'/组件名',
component:()=>import('组件相对地址')//懒加载
}