Vue.js 是目前最火的一个前端框架,React是最流行的一个前端框架(React除了开发网站,还可以开发手机App, Vue语法也是可以用于进行手机App开发的,需要借助于Weex)
Vue.js 是前端的主流框架之一,和Angular.js、React.js 一起,并成为前端三大主流框架!
Vue.js 是一套构建用户界面的框架,只关注视图层,它不仅易于上手,还便于与第三方库或既有项目整合。(Vue有配套的第三方类库,可以整合起来做大型项目的开发)
前端的主要工作?主要负责MVC中的V这一层;主要工作就是和界面打交道,来制作前端页面效果;
MVC 是后端的分层开发概念;
MVVM是前端视图层的概念,主要关注于 视图层分离,也就是说:MVVM把前端的视图层,分为了 三部分 Model, View , VM ViewModel
为什么有了MVC还要有MVVM
v-clock
使用v-clock能够解决差值闪烁的问题
v-text
默认 v-text 没有闪烁问题
v-text会覆盖元素中原本的内容, 但是差值表达式{ { 变量 }}
,只会替换自己的占位符,不会把整个元素内容清空
<div id="app">
<div v-text="htm">div>
<div v-html="htm">div>
div>
<script type="text/javascript">
var vm=new Vue({
el: '#app' ,
data:{
htm:'我是大标题
',
},
})
script>
v-bind
的三种用法直接使用指令v-bind
使用简化指令:
在绑定的时候,拼接绑定内容::title="btnTitle + ', 这是追加的内容'"
v-bind
:
<div id="app">
<input type="text" value="msg" />
<input type="text" v-bind:value="msg" />
div>
<script type="text/javascript">
var vm = new Vue({
el: '#app',
data: {
msg: '我爱中国',
},
})
script>
v-on
@
<div id="app">
<button v-on:click="show">点击button>
div>
<script type="text/javascript">
var vm=new Vue({
el: '#app' ,
methods:{
// 定义了Vue 实例所有可用的方法
show: function(){
alert('hello')
}
show(){
//简写
alert('hello')
}
}
})
script>
<div id="app">
<p>{
{info}}p>
<input type="button" value="开启" v-on:click="go">
<input type="button" value="停止" v-on:click="stop">
div>
// 创建 Vue 实例,得到 ViewModel
var vm = new Vue({
el: '#app',
data: {
info: '猥琐发育,别浪~!',
intervalId: null
},
methods: {
go() {
// 如果当前有定时器在运行,则直接return
if (this.intervalId != null) {
return;
}
// 开始定时器
this.intervalId = setInterval(() => {
this.info = this.info.substring(1) + this.info.substring(0, 1);
}, 500);
},
stop() {
clearInterval(this.intervalId);
}
}
});
.stop 阻止冒泡
.prevent 阻止默认事件
.capture 添加事件侦听器时使用事件捕获模式
.self 只当事件在该元素本身(比如不是子元素)触发时触发回调,只会阻止自己身上的冒泡行为触发,并不会真正阻止 冒泡行为
.once 事件只触发一次
<div id="app">
<div class="inner" @click="divHandler">
<button class="btn" @click.stop="btnHandler">戳我button>
div>
<a href="http://www.baidu.com" @click.prevent="linkClick">点我去百度a>
<div class="inner" @click.capture="divHandler">
<button class="btn" @click="btnHandler">戳我button>
div>
<div class="inner" @click.self="divHandler">
<button class="btn" @click="btnHandler">戳我button>
div>
<a href="http://www.baidu.com" @click.prevent.once="linkClick">点我去百度a>
div>
<script type="text/javascript">
var vm=new Vue({
el:'#app',
data:{
},
methods:{
divHandler:function(){
console.log('这是div')
},
btnHandler:function () {
console.log('这是btn')
},
linkClick: function() {
console.log('link事件')
}
}
})
script>
v-model
和双向数据绑定
<div id="app">
<h6>{
{ msg }}h6>
<input type="text" v-bind:value="msg" />
<input type="text" v-model:value="msg" />
div>
<script type="text/javascript">
var vm = new Vue({
el: '#app',
data: {
msg: '我爱中国',
},
})
script>
<div id="app">
<input type="text" v-model="n1" />
<select v-model="opt">
<option value="+">+option>
<option value="-">-option>
<option value="*">*option>
<option value="/">/option>
select>
<input type="text" v-model="n2" />
<input type="button" value="=" @click="calc" />
<input type="text" v-model="result" />
div>
<script type="text/javascript">
var vm = new Vue({
el: "#app",
data: {
n1: 0,
n2: 0,
result: 0,
opt: '+',
},
methods: {
calc() {
//计算器
// switch(this.opt) {
// case '+':
// this.result = parseInt(this.n1) + parseInt(this.n2)
// break;
// case '-':
// this.result = parseInt(this.n1) - parseInt(this.n2)
// break;
// case '*':
// this.result = parseInt(this.n1) * parseInt(this.n2)
// break;
// case '/':
// this.result = parseInt(this.n1) / parseInt(this.n2)
// break;
// }
var codeStr= 'parseInt(this.n1)'+ this.opt +'parseInt(this.n2)'
this.result=eval(codeStr)
}
}
})
script>
<h1 :class="['red', 'thin']">这是一个邪恶的H1h1>
代替三元表达式
<h1 :class="['red', 'thin', isactive?'active':'']">这是一个邪恶的H1h1>
<h1 :class="['red', 'thin', {
'active': isactive}]">这是一个邪恶的H1h1>
<h1 :class="{red:true, italic:true, active:true, thin:true}">这是一个邪恶的H1h1>
:style
的形式,书写样式对象<h1 :style="{
color: 'red', 'font-size': '40px'}">这是一个善良的H1h1>
data
中,并直接引用到 :style
中data: {
h1StyleObj: {
color: 'red', 'font-size': '40px', 'font-weight': '200' }
}
<h1 :style="h1StyleObj">这是一个善良的H1h1>
:style
中通过数组,引用多个 data
上的样式对象data: {
h1StyleObj: {
color: 'red', 'font-size': '40px', 'font-weight': '200' },
h1StyleObj2: {
fontStyle: 'italic' }
}
<h1 :style="[h1StyleObj, h1StyleObj2]">这是一个善良的H1h1>
v-for
和key
属性<ul>
<li v-for="(item, i) in list">索引:{
{i}} --- 姓名:{
{item.name}} --- 年龄:{
{item.age}}li>
ul>
<div v-for="(val, key, i) in userInfo">{
{val}} --- {
{key}} --- {
{i}}div>
<p v-for="i in 10">这是第 {
{i}} 个P标签p>
2.2.0+ 的版本里,当在组件中使用 v-for 时,key 现在是必须的。
当 Vue.js 用 v-for 正在更新已渲染过的元素列表时,它默认用 “就地复用” 策略。如果数据项的顺序被改变,Vue将不是移动 DOM 元素来匹配数据项的顺序, 而是简单复用此处每个元素,并且确保它在特定索引下显示已被渲染过的每个元素。
为了给 Vue 一个提示,以便它能跟踪每个节点的身份,从而重用和重新排序现有元素,你需要为每项提供一个唯一 key 属性。
v-if
和v-show
一般来说,v-if 有更高的切换消耗而 v-show 有更高的初始渲染消耗。因此,如果需要频繁切换 v-show 较好,如果在运行时条件不大可能改变 v-if 较好。
<div id='app'>
<button @click='flag=!flag'>切换button>
<h3 v-if='flag'>这是v-if控制的元素h3>
<h3 v-show='flag'>这是v-show控制的元素h3>
div>
<script>
var vm= new vue({
el:'#app',
data:{
flag=true,
},
methods:{
}
})
script>