vue系列--【vue核心、vue实例、指令】
1.vue初探
官网:https://cn.vuejs.org/
介绍:
vue是渐进式 JavaScript 框架
渐进式 :主张最少。
优点:
1.轻量级的数据框架
2.双向数据绑定
3.提供了指令
4.组件化开发
5.客户端路由
6.状态管理
缺点:
1.Vue 底层基于 Object.defineProperty 实现响应式,而这个 api 本身不支持 IE8 及以下浏 览器,所以Vue不支持IE8及其以下浏览器;
2.Vue 打造的是SPA,所以不利于搜索引擎优化(SEO);
3.由于 CSR的先天不足,导致首屏加载时间长,有可能会出现闪屏。
核心:
数据驱动 组件系统
MVVM:
M-model模型
V-view视图
VM-viewModel 视图模型
模型(model)通过了视图模型 决定了视图(view)
视图(view) 通过视图模型 修改模型 (model)
视图模型是模型和视图之间的桥梁。
SPA:
single page application 单页面应用
优点:加载快,用户体验好
缺点:不利于SEO,首屏加载时间长
a页面—>index.html/#/a
b页面—>index.html/#/b
MPA:
多页面应用
优点:有利于SEO
缺点:会有白屏,用户体验不好
a页面—>a.html
b页面—>b.html
安装:
1.cdn [不推荐]
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
2.下载vue.js [不推荐]
3.npm [推荐]
npm init
npm i vue
4.脚手架[做项目]
引用:
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script src="./vue.js"></script>
<script src="./node_modules/vue/dist/vue.js"></script>
2.vue实例
1.如何用?
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<!-- 1.引入 -->
<script src="./vue.js"></script>
</head>
<body>
<!-- 2.作用范围 -->
<div id="app">
<div>{{1+1}}</div>
<div>{{2+2}}</div>
</div>
<script>
// 3.实例化vue
new Vue({
el:"#app"
})
</script>
</body>
</html>
2.el
new Vue({
//挂载点 mount-挂载
//1.一个vue对象只能作用在1个节点上,如果el有多个节点满足条件,也只作用在满足条件的第一个节点上。
//2.Do not mount Vue to <html> or <body> - mount to normal elements instead.
// 不要把vue挂到html|body上
// 3.由于一个vue只能作用在一个节点上,所以一般使用id
el:"#app"
})
3.data methods
new Vue({
//挂载点 mount-挂载
el:"#app",
//属性
data:{
a:1,
b:false,
c:"嘻嘻嘻",
tel:"15727273030"
},
//方法
methods:{
fn1(){},
fn2(){},
fn3(){}
}
})
4.{{}} 模板语法
<!-- {{}} 模板语法 ,{{}}外面html解析,{{}}里面 js解析 -->
<!-- {{}}只能写1句话 -->
<!-- {{}}非表单元素 eg:div、p、h1-h6 、ul li ... -->
<!-- 变量 -->
<div>{{c}}</div>
<!-- 方法 -->
<div>电话号是:{{tel.slice(0,3)}}****{{tel.slice(7)}}</div>
<!-- 表达式 -->
<div>{{b?'水杯':"电脑"}}</div>
3.指令
非表单元素绑定数据
{{}} 优点:简单方便 缺点:会出现首屏闪屏问题
v-text 优点:可以解决首屏闪屏问题
v-html 优点:可以解析标签
表单元素绑定数据
<input type="text" v-model="name">
属性绑定-媒体元素
<div id="app">
<!-- v-bind: 属性绑定 简写 : -->
<!-- v-bind 不仅可以绑定已知属性,也可以绑定自定义属性 -->
<img v-bind:src="img" alt="">
<a v-bind:href="website.url">
<img v-bind:src="website.logo" alt="">
</a>
<a :href="website.url">
<img :src="website.logo" alt="">
</a>
<div a="1" b="2" :c="name">哈哈哈</div>
</div>
<script>
new Vue({
el: "#app", //挂载点 mount
data: { //属性-数据
name:"妲己",
img:"https://img0.baidu.com/it/u=3026939796,485761977&fm=26&fmt=auto&gp=0.jpg",
website:{
name:"淘宝",
url:"http://taobao.com",
logo:"http://gw.alicdn.com/tfs/TB176rg4VP7gK0jSZFjXXc5aXXa-286-118.png"
}
},
methods: {}
})
</script>
动态类名
<!-- 1. :class="[三元]" -->
<div class="movie">
<!-- 0-blue 1-lime 2-blue 3-lime 4-blue 5-lime -->
<div class="movie-item" v-for="(item,index) in movie"
:class="[index%2==0?'blue':'lime']"
>
<img :src="item.img" alt="">
<div>{{item.name}}</div>
<div>评分:{{item.rate}}</div>
</div>
</div>
<hr>
<!-- 2.:class="{类名1:true,类名2:false,... }" true就会有该类名,false就会没有 -->
<div class="movie">
<!-- 0-blue 1-lime 2-orange 3-blue 4-lime 5-orange
blue:index%3==0
lime:index%3==1
orange:index%3==2
-->
<div class="movie-item" v-for="(item,index) in movie"
:class="{blue:index%3==0,lime:index%3==1,orange:index%3==2}"
>
<img :src="item.img" alt="">
<div>{{item.name}}</div>
<div>评分:{{item.rate}}</div>
</div>
</div>
一次性绑定
v-once
<!-- 一次性数据绑定 -->
<div v-once>{{name}}</div>
事件绑定
<div id="app">
<div>{{name}}</div>
<!-- 事件绑定 v-on:事件名称="方法" -->
<button v-on:click="changeWang()">王昭君</button>
<button v-on:click="changeName('貂蝉')">貂蝉</button>
<button v-on:click="changeName('宫本')">宫本</button>
<button v-on:click="changeName('鲁班')">鲁班</button>
</div>
<script>
new Vue({
el: "#app",
data: {
name: "妲己"
},
methods: {
changeWang() {
this.name = "王昭君";
},
changeName(name) {
this.name = name;
}
}
})
</script>
条件渲染
v-if VS v-show
相同点:true 就出现,false就消失。
不同点:v-if false采用的是惰性加载;v-show false采用的是display:none;
使用场景:频繁切换,建议使用v-show;如果不频繁切换,建议使用v-if.
v-else
<!-- v-else 需要和v-if紧挨着 -->
<div v-if="comments.length>0">评论是:{{comments}}</div>
<div v-else>暂无评论</div>