社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
jQuery
库是针对js
的dom
的封装,封装了好多原生js
的dom
操作繁琐的地方,那Vuejs
是针对 html+css+js
的一个封装 虽然vuejs
没有脱离这三大技术,但是 在原有基础上进行了整合 推出了 组件化开发的概念。
Model
- - - View
- - - Controllor
模型 - - - 视图 - - - 控制者
Model
- - - View
- - - View
- - - Model
模型 - - - 视图 - - - 视图 - - - 模型
数据直接对应页面;
数据变化 页面就变化;
页面变化 数据就变化;
干掉了 传统MVC结构中的业务逻辑 直接使数据和页面绑定;
让页面操作更简单,所以Vue中没有 js的dom操作
<!--第二步 一片html代码-->
<div id="app">
<h1>{{msg}}</h1>
</div>
//第一步: 引入vue.js文件
<script src="vue.js"></script>
<script>
//第三步 定义json渲染vue
var vm=new Vue({
el:"#app",
data:{
msg:"Hello World!"
}
})
</script>
<div id="app">
<h1>{{msg}}</h1>
<input type="text" v-model="msg">
</div>
<script src="vue.js"></script>
<script>
var vm=new Vue({
el:"#app",
data:{
msg:"Hello World!"
}
})
</script>
<!--第二步: 一片html代码 一般先定义一个统一的父元素,然后用vue去加载这一块元素
那么以后这一块元素内所有的位置 都按照vue的语法来加载-->
<div id="app">
<!--这个是 Mustache模板语法
格式: {{js表达式}} js表达式包括: 三目表达式 运算符表达式
方法调用 变量
这个语法表示一种模板 将来会受vue渲染并执行
就想蒸蛋糕的那个模具一样 会按照我们写的格式进行加载并取得结果
-->
<h1>{{msg}}</h1>
</div>
<!--第一步 : 引入vue.js文件-->
<script src="vue.js"></script>
<script>
/*第三步: 定义json、渲染vue代码;
先把Vue对象创建出来,
构造方法需要传入一个json进行vue对象的配置,
有点类似于 `$.ajax({})` 参数的大括号就是针对当前ajax进行配置*/
var vm=new Vue({
//挂载目标(表示:当前vue语法,挂载到哪一个目标元素上面去;一旦挂载,那么该目标就按照vue语法加载)
el:"#app", //值是一个字符串 里面传入选择器(一会讲 都支持哪些选择器)
data:{ /*定义data是专门给挂载目标里面所使用的所有变量赋值*/
msg:"我是vue变量的值"
}
});
</script>
id选择器;
class选择器(如果有多个 只会选择第一个);
元素选择器;
如果有多个 只会选择第一个
Vue2.x版本 不允许直接挂载到body上面去!!!Do not mount Vue to <html> or <body> - mount to normal elements instead
.
子代/后代选择器;
交集选择器;
所有的css3选择器 都支持;
var vm=new Vue({
//ID选择器
// el:"#app",
//class选择器
// el:".pox",
//元素选择器
// el:"div",
//子代/后代选择器
// el:"body>#app",
//交集选择器
// el:"div#app",
//所有css3选择器也支持
el:"div:nth-child(1)",
data:{
msg:"我是数据"
}
})
1.字符串
2. number类型
3. boolean类型
4. 数组类型
5. 对象类型
6. 内置对象类型
<div id="app">
<h1>{{msg}}</h1>
<h1>{{num}}</h1>
<h1>{{boo}}</h1>
<h1>{{arr}}</h1>
<h1>{{json}}</h1>
<h1>{{d}}</h1>
</div>
var vm=new Vue({
el:"#app",
data:{
msg:"我是字符串类型",
num:5,
boo:false,
arr:["关羽","张飞","刘备"],
json:{
name:"小明",
age:16
},
d:new Date()
}
})
vue
中提供了一些以v-
开头的指令,专门写到标签上面的,那么这些指令作用: 扩展标签原有功能
;
该指令控制元素的显示与隐藏 v-show="变量或者表达式"
;
变量或者表达式结果是true
时 ,该元素显示;否则false
隐藏。v-show
指令:控制的是元素的 display
属性。
<div id="app">
<div id="box" v-show="boo"></div>
</div>
<script src="js/vue.js"></script>
<script>
var vm=new Vue({
el:'#app',
data:{
boo:true
}
});
</script>
v-if
指令:也是控制元素的显示与隐藏。
v-if="变量或者表达式"
变量或者表达式为true
时元素显示、否则隐藏; 跟 v-if
搭配使用的就是 v-else
, 如果v-if
的条件为false
则v-else
的元素显示; v-else
没有值v-if
的变化而变化,跟if..else语句
一样。v-else-if="变量或者表达式"
如果v-if
里面的条件是false
则继续向下判断v-else-if
;v-else-if
可以有多个 谁是true
谁显示。v-if
和v-else-if
和v-else
标签之间,不能有任何其他标签 否则报错!也就是保证v-if
语句的完整性。
v-show
控制元素的显示隐藏用的是 display
属性,也就是说不管条件是true还是false元素都会加载,只不过如果条件为false 元素设置display:none
;v-if
控制元素的显示与隐藏用的是 加载与不加载 如果条件为false
则元素直接从dom
中删除,如果条件为true
则重新加载该元素。如果页面加载时 条件为false
那么该元素都不会存在到dom中。v-show
;v-if
;<div id="app">
<!--<div id="box" v-if="boo"></div>
<div id="pox" v-else></div>-->
<ul>
<li v-if="num==1">我是第一个li</li>
<li v-else-if="num==2">我是第二个li</li>
<li v-else-if="num==3">我是第三个li</li>
<li v-else>我是第四个li</li>
</ul>
</div>
var vm=new Vue({
el:'#app',
data:{
boo:true,
num:1,
}
});
v-for
指令:可以实现 遍历数组或者js对象;然后根据遍历出来的数量加载指定数量的元素。
数组、对象需要在vue
的data
里面定义。
<标签 v-for="变量 in 数组对象">{{变量}}</标签>
<标签 v-for="(元素变量,索引标量) in arr">{{变量}}---{{索引}}</标签>
<标签 v-for="属性值 in json对象"></标签>
<标签 v-for="(属性值,属性名) in json对象"></标签>
<标签 v-for="(属性值,属性名,索引) in json对象"></标签>
<div id="app">
<div v-for="k in arr">{{k}}</div>
<ul>
<li v-for="(item,index) in arr">{{item}}====={{index}}</li>
<li v-for="item in per">{{item}}</li>
<li v-for="(item,key) in per">{{item}}====={{key}}</li>
<li v-for="(value,key,index) in per">{{key}}====={{value}}===={{index}}</li>
</ul>
var vm=new Vue({
el:'#app',
data:{
arr:["关羽","刘备","张飞","庞统","李白"],
per:{
name:"小强",
age:18,
gender:"男",
location:"善知教育"
}
}
});
mustache语法
是一种模板语法 在vue未加载到该语法代码时,则该语法看起来像是乱码一样,只有vue挂载成功了以后 才真正加载。
假设当前网速缓慢,比如下面代码我们用 setTimeout
模拟网速缓慢,那么页面加载时 会优先显示一个 花括号{{}}
,这样给用户的 带来非常不好的体验。
mustache语法
使用时 先加载 花括号{{}}
,再加载内容的方式该如何处理呢?v-cloak
指令:该指令的作用就是保证了 mustache语法
在未加载出来之前 并不显示,直到语法加载成功后 才显示,但是需要css配合: [v-cloak]{display:none;}
。v-cloak
以后 那么如果mustache语法未加载时 则标签具有该属性,跟css属性选择器配合
导致元素不显示,直到mustache语法
的值加载成功,则自动删除该属性 元素就显示出来了。<div id="app">
<h1 v-cloak>{{msg}}</h1>
<h1 v-html="str2">我是默认内容</h1>
<h1 v-text="str2">我也是默认内容</h1>
</div>
setTimeout(()=>{
var vm=new Vue({
el:'#app',
data:{
msg:"HelloWorld!",
str1:"我是str1的内容",
str2:"<a href='http://www.baidu.com'>我是a标签</a>"
}
});
},2000)
v-html="变量或者表达式"
;v-text="变量或者表达式"
;
这两个指令都是能够把 变量或者表达式的值
作为当前标签的内部内容来渲染,如果标签原本内部有内容则覆盖。
这两个指令的区别就是: 如果内容中有标签 那么v-html
可以渲染标签,v-text
不可以渲染标签 只会把内容原封不动渲染到页面上。
这两个指令也具有 渲染成功后才显示的效果,所以有些地方如果要渲染一些变量内容 也可以使用该指令。
v-model
指令:是专门用在输入框上面 用来替代 输入框的value
属性,让输入框的value
可以关联一个vue
的变量,从而实现双向数据绑定
<input type="text" v-model="变量">
要注意: 一旦输入框使用了v-model
那么就不要再定义 value
属性,因为v-model
就代替value
属性。v-model
的标签:input
,textarea
标签。<div id="app">
<input type="text" v-model="msg">
<textarea v-model="msg" id="" cols="30" rows="10"></textarea>
<h1>{{msg}}</h1>
<h1 v-html="msg"></h1>
</div>
var vm=new Vue({
el:'#app',
data:{
msg:"HelloWorld!"
}
});
如果我们的指令想要控制的标签元素(一堆标签)不是单个标签,那么之前的做法是 再添加一个父元素标签 然后把指令定义到统一的父元素标签上面去。
v-if
还是v-for
还是v-show
都是这样做的,但是如果实际开发的需求不允许我们再添加一个父元素标签了呢?vue
中的template
标签。Vue
中重新定义了它的功能,在vue
中template
标签不渲染, 也就是说我们可以写指令控制template
里面的元素,但是template
本身又不渲染到页面上。template
标签不能使用v-show
指令!!!v-if
和template
配合使用 可以实现分组管理<!--<template>我是template标签</template>-->
<div id="app">
<!--<div v-for="(item,index) in arr">
<div>{{item}}:我是第一个div</div>
<div>{{item}}:我是第二个div</div>
<div>{{item}}:我是第三个div</div>
</div> -->
<!--<template v-for="(item,index) in arr">
<div>{{item}}:我是第一个div</div>
<div>{{item}}:我是第二个div</div>
<div>{{item}}:我是第三个div</div>
</template>-->
<template v-if="boo">
<div>我是一个div</div>
<div>我也是</div>
</template>
<template v-else>
<ul>
<li>我是一个li</li>
<li>我也是li</li>
</ul>
</template>
</div>
var vm=new Vue({
el:'#app',
data:{
arr:["小明","小红","大婷"],
boo:true
}
});
vue中 使用v-on
指令来绑定事件:
格式: <标签 v-on:不带on的事件类型="事件方法名"></标签>
暂时不需要事件对象时 驱动函数名可以不加括号
该事件要在Vue
的json
里面定义:
methods:{
驱动函数名:function(){}
}
v-on
指令使用时 开发工具会提示添加命名空间:xmlns:v-on="http://www.w3.org/1999/xhtml"
没啥用 添不添加都行,不影响运行。
如果实在看不过去 我们v-on
有简化写法:<标签 @不带on的事件名称="事件驱动函数名"></标签>
在事件的驱动函数里面 通过this
可以直接访问data
里面的变量
要注意: this.
不能省略
var vm=new Vue({
el:'#app',
data:{
msg:"我是默认内容"
},
methods:{
show:function(){
alert("你点我干嘛")
},
show1:function(){
console.log("鼠标移入了");
},
getData(){
// console.log(this.msg);
this.msg="哈哈,新内容吧";
}
}
});
//补充: es6中 json对象绑定方法 可以向下面这样去写
var per={
name:"小强",
//es6的新写法
show(){
console.log("我是show方法");
}
}
per.show()
class Person{
sayHi(){
}
}
vue
中的event
事件对象需要在绑定事件的标签上面传入$event
参数。<标签 @事件名称="事件驱动函数($evnet)"> </标签>
$event
是固定写法 必须这么写,然后在事件驱动函数里面 第一个参数接收event
。event
属性跟原来学习的没有任何差别。$event
那么事件驱动函数也无法接收event
event
事件对象 而是传入自定义数据<li v-for="(item,index) in arr" @click="getData(item,index)">{{item}}</li>
event
对象 还需要 传入数据 那么必须保证$event
是在第一个参数位置:<li v-for="(item,index) in arr" @click="getData1($event,item,index)">{{item}}</li>
。<div id="app">
<!-- <div id="box" @click="show($event)"></div>-->
<div id="box" @click="show($event)"></div>
<ul>
<!--不使用event对象的情况下传入参数-->
<li v-for="(item,index) in arr" @click="getData(item,index)">{{item}}</li>
</ul>
<ol>
<!--如果有event也有其他数据 那么必须保证 $event在第一位-->
<li v-for="(item,index) in arr" @click="getData1($event,item,index)">{{item}}</li>
</ol>
</div>
var vm=new Vue({
el:'#app',
data:{
msg:"HelloWorld!",
arr:["关羽","刘备","张飞","袁绍","庞统"]
},
methods:{
show(event){
console.log(event);
},
getData(s,i){
// console.log(s,i);
this.arr.splice(i,1);
},
getData1(event,item,index){
console.log(event,item+"---"+index);
}
}
});
vue
中阻止事件冒泡不用event
对象 直接使用事件修饰符即可
<标签 @事件名称.修饰符="驱动函数"></标签>
stop
: 阻止事件冒泡prevent
: 阻止默认事件once
: 该事件只能触发一次self
: 只有event.target===this
的时候才触发该事件<div id="app">
<!--<div id="box" @contextmenu.prevent="demo" @click.once="boxclick($event)">-->
<div id
版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_40041509/article/details/109438812
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
-
发表于 2021-06-14 21:50:32
- 阅读 ( 735 )
- 分类:前端
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!