简单认识Vue.js
, 官方连接:Vue官网,首先需要说明的一点 ,js原生代码中的Var声明变量会提前声明的现象,所以在实际开发中不推荐使用,推荐使用的变量声明方式如下:
let
:定义变量,比较推荐使用,不推荐使用var
const
:用于定义常量方式一:直接CDN引入
//对于制作原型或学习,可以这样使用最新版本:
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
//对于生产环境
<script src="https://cdn.jsdelivr.net/npm/[email protected]"></script>
方式二:下载和引入
直接下载并用
# 最新稳定`在这里插在这里插入代码片入代码片`版
$ npm install vue
初次体验
<body>
<div class="app">{{name}}</div>
</body>
<script src="./vue.js"></script>
<script>
let app=new Vue({
el:'.app',//选择器
data:{
name:'VueJs'
}
})
</script>
view层
:视图层,也叫Dom层,用来向用户展示各种信息Model
层:数据层,VueModel
层:视图模型层,是View和Model之间数据交互的通道,一方面实现了数据绑定(Data binding),实现了View层数据的实时渲染;一方面实现了Dom监听(Dom Listener),监听Dom发生的事件,如点击,滚动等事件,并根据事件调用不同的方法。在创建Vue实例的时候,Vue会向实例传入options
对象,该对象包含的属性有:
const app = new Vue({
el:'#app',
data:{
name:'lee'
},
methods:{
add:function(){
//....
},
sub: function(){
//....
}
}
})
常见的标签
v-for
遍历//迭代数组
{{i}}--->{{item.price}}
//迭代对象
--键是--{{key}}--值是--{{val}}
v-bind
:绑定class属性对象,bind:class="{isActive:true,isLine:true}"
v-bind
,绑定 style属性 ,bind:style="{fontSize:‘50px’}",注意value值需要加上单引号。若没有加上单引号,Vue就会当成一个变量来解析。
绑定基本属性:v-bind:src=’ xxxSrc ’ , v-bind:herf=’ xxxUrl ’ .
v-pre
,不解析文本中的标签,直接以文本的方式展示到页面上
v-html
,解析文本中的标签
v-text
, 插入文本
v-cloak
:斗篷,[v-cloak]:{display:none}
v-on:click
:事件监听
computed
:在new Vue() 的对象中,添加了这个属性,用于计算不同属性的值
let app = new Vue({
el: '.app', //选择器
data: {
name: 'VueJs',
fontSize: '100px'
},
computed: {
totalPrice:function(){
let price=0;
for(let i=0;i<this.books.length;i++){
price +=this.books[i].price;
}
return price;
}
},
methods:{
}
})
new Vue({option}),创建的对象中传入的是option对象.
计算属性的setter和getter
计算属性中的方法,原本的写法是这样的
fullName:function(){
return this.firstName +" "+this.lastName
}
//原型写法
fullName:{
set:function(){
//setter方法,一般情况下,不会使用setter方法
}
get: function(){
//getter方法
}
}
但是由于计算属性一般没有set方法,它是只读属性。所以可以简写成上面的computed的对象上写的那样。
如果使用set方法设置属性,则设置的语句为app.fullName=‘abc’ ,computed
计算属性有缓存。相比较methods
来说,性能比较好。若页面中有多个地方使用该属性,只会调用一次方法的执行。
对象的增强写法
属性的增强写法:
let name='lee';
let age=18;
const obj ={name,age}
方法的增强写法
//ES6的写法
const obj={
run(){
//方法的增强写法
}
}
//ES5的写法
const obj ={
run :function(){
//方法的定义
}
}
事件监听
v-on
用于绑定事件监听器,缩写是@
,基本使用的方法, 如:v-on:click
@click
<button @click='btnClick'> 按钮 </button>
在调用方法时候,手动的获取到浏览器参数的event对象,需要这样写$event
//监听点击事件
<button @click='btnClick('abc',$event)'> 按钮 </button>
//阻止事件冒泡
<button @click.stop='btnClick('abc',$event)'> 按钮 </button>
//阻止浏览器默认行文
<button @click.prevent='btnClick('abc',$event)'> 按钮 </button>
//监听键盘的Enter事件
<input @keyup.enter='keyUp'> 按钮 </button>
//只监听一次事件
<button @click.once='btnClick('abc',$event)'> 按钮 </button>
条件判断
v-if的使用
<div id="app">
<div v-if='isShow'> 显示</div>
</div>
<script>
const app=new Vue({
el:'#app',
data:{
isShow:false
}
})
</script>
v-if ,v-else-if, v-else的结合使用
<div v-if='isShow'> 显示if</div>
<div v-else-if='isShow'> 显示else if</div>
<div v-else>else的内容</div>
v-show 和 v-if的区别
v-show
会在Dom中创建元素,只是当它的值为false
的时候,它增加一个行内样式display:none
,而当 v-if
的值为false
时候,它并 不会在Dom中创建元素,所以当元素的显示和隐藏使用的频率很高的时候,建议使用v-show
,当只有一次切换的时候,建议使用v-if
v-for 遍历数组和对象
//没有显示下标值
<li v-for='item in names'>{{item}}</li>
//遍历过程中,使用下标
<li v-for='(item,index) in names'>{{index}}===>{{item}}</li>
//script
const app = new Vue({
el: '#app',
data: {
names:['a','b','c','d']
},
methods: {
shift(){
this.isShow= !this.isShow;
}
}
})
//仅仅获取属性值
<li v-for='value in user'>{{value}}</li>
//获取属性值和属性名
<li v-for='(value,key) in user'>{{key}}===>{{value}}</li>
//获取属性值,属性名和index,使用较少
<li v-for='(value,key,index) in user'>{{index}}===>{{key}}===>{{value}}</li>
let total =0;
for(let item of this.books){
total +=item.count*item.price;
}
官方推荐在遍历对象和数组的时候,加上key属性
//尽量保证绑定key的唯一性
<li v-for='item in names' :key='item'>{{item}}</li>
数组方法中的响应式方法
数组中的方法,并不是所有的都是响应式的,有的方法即使修改了数组的内容,也不会立即在页面上展示出来。
响应式的方法
Vue的filter的使用
双花括号插值和 v-bind 表达式 (后者从 2.1.0+ 开始支持)。过滤器应该被添加在 JavaScript 表达式的尾部,由“管道”符号指示:
<!-- 在双花括号中 -->
{{ message | capitalize }}
<!-- 在 `v-bind` 中 -->
<div v-bind:id="rawId | formatId"></div>
//过滤器的定义
filters: {
capitalize: function (value) {
if (!value) return ''
value = value.toString()
return value.charAt(0).toUpperCase() + value.slice(1)
}
}
编程范式中,面向对象编程的(第一公民:对象),函数式编程(第一公民:函数)
let newNums= nums.filter(function(n){
//return false ; 过滤掉该对象
//return true ; 不会过滤掉该对象
})
//过滤小于100的数字
nums.filterr(function(n){
return n<100;
})
//对数组中的每一个数字*2
nums.map(function(n){
return n*2;
})
//preValue:初始化默认值
nums.reduce(function(preValue,n){
},0)//初始话默认值是0,preValue =0;
表单绑定 v-model
实现数据的双向绑定,若改变data中定义的数据,Dom标签中绑定的数据也会改变;若改变Dom标签中的数据,则data中定义的数据也会改变,可用于textarea
的功能
<body>
<div id="app">
<input type="text" v-model='message'/>
//等同于
<input type="text" v-bind:value='message' v-on:input='message=$event.target.value'>
//`v-on:input='inputChange'` 用户监听用户的输入事件,当用户在输入栏输入数据时候,就会调用`inputChange`方法
</div>
</body>
<script src="../vue.js"></script>
<script>
const app =new Vue({
el:'#app',
data:{
message:'Hello'
}
})
</script>
选择的是:{{fruits}}
<div id="app">
<label v-for='item in originFruits' :for='item'>
<input type="checkbox" :value='item' v-model='hobbies'>
{{item}}
</label>
<div>选择的是:{{hobbies}}</div>
</div>
</body>
<script src="../vue.js"></script>
<script>
const app = new Vue({
el: '#app',
data: {
message: 'Hello',
hobbies: [],
originFruits: ['篮球', '足球', '乒乓球', '羽毛球', '台球']
}
})
</script>
v-model 修饰符的使用
v-model.lazy
, 实现节流,v-model实现的双向绑定,在用户每输入一个字符都会实时更新绑定的对象的内容,这样的效果并不高效的,现有的需求是,当用户输入完成后,按下Enter键才会进行更新,此时加上lazy修饰符就可以解决v-model.number
, 实现绑定的的数字类型不会转换成String。v-model.trim
,去除用户输入的空格