Vue的使用(一)-基础

1.引入VUE

<script src="https://cdn.bootcss.com/vue/2.5.2/vue.min.js"></script>

2.创建vue对象

el : 指定根element(选择器)
data ; 初始化数据(页面可以访问)

<script src="https://cdn.bootcss.com/vue/2.5.2/vue.min.js"></script>
<script>
new Vue({
el:'#app',
data:{
msg:'<a href="http://www.baidu.com">I will back</a>',
imgUrl:'https://ss0.bdstatic.com/70cFvHSh_Q1YnxGkpoWK1HF6hhy/it/u=205441424,1768829584&fm=26&gp=0.jpg'
},
methods:{
test(){alert("hello!")}
}
});
</script>

3.双向数据绑定

v-model

4.显示数据

<p>{{xxx}}</p> 相当于textContent
<p>{{xxx.toUpperCase()}}</p>  xxx是js,可以用一些函数
<p v-text="xxx"></p> 相当于textContent,和{{}}差不多,把里面的内容转化为文本
<p v-html="xxx"></p> 相当于innerHTML,会把里面的内容转化为html

强制绑定:

<img v-bind:src="imgUrl"/>
<img :src="imgUrl"/>    v-bind可以省略

绑定事件监听:

<img v-on:click="test"/>
<img @click="test"/>   用@,v-on可以省略

计算属性computed
计算属性存在缓存,多次重复读取只执行一次getter计算
使用计算属性就可以不写data了

<input type="text" v-model="firstName"/>
<input type="text" v-model="lastName"/>
<input v-model="fullname"/>
<script src="https://cdn.bootcss.com/vue/2.5.2/vue.min.js"></script>
<script>
new Vue({
el:'#app',
data:{
firstName:'A',
lastName:'B' 
},
computed:{
//初始化数据/相关data改变时,调用
fullName(){

 return this.firstName+' '+this.lastName; 
}
}
</script>

get/set计算属性

<input type="text" v-model="firstName"/>
<input type="text" v-model="lastName"/>
<input v-model="fullname"/>
<input v-model="fullname2"/>
<input v-model="fullname3"/>
<script src="https://cdn.bootcss.com/vue/2.5.2/vue.min.js"></script>
<script>
const vm =new Vue({
el:'#app',
data:{
firstName:'A',
lastName:'B' 
},
watch:{
firstName:fuction(value){//firstName发生变化时调用
//this就是vm对象,vue的实例
this.fullName=value+' '+this.lastName; 
},
computed:{
fullName3:{
//当读取当前属性时调用
   get(){
   return this.firstName+' '+this.lastName;
   },
   //监视当前属性的变化
   set(value){//value就是fullName3的最新属性值
   const names=value.split(' ');
   this.firstName=names[0];
   this.lastName=names[1];
   }
   }
}
})

</script>

监视watch

<input type="text" v-model="firstName"/>
<input type="text" v-model="lastName"/>
<input v-model="fullname"/>
<script src="https://cdn.bootcss.com/vue/2.5.2/vue.min.js"></script>
<script>
new Vue({
el:'#app',
data:{
firstName:'A',
lastName:'B' 
},
watch:{
firstName:fuction(value){//firstName发生变化时调用
//this就是vm对象,vue的实例
this.fullName=value+' '+this.lastName; 
}
})
vm.$watch('lastName',fuction(value){
 this.fullName2=this.firstName + ' '+value;
})	
	

</script>

class绑定
:class=“xxx” xxx可以是字符串,对象,数组

style绑定
:style"{xxx}"

条件渲染

指令:
v-if , v-else ,v-show

比较v-if v-else和v-show:
需要频繁的切换使用v-show比较好,因为if,else为false是移除,v-show为false是隐藏


<p v-if="ok">ok为ture则显示</p>
<p v-else>ok为false则显示</p>

<p v-show="ok">ok为ture则显示</p>

列表渲染

v-for遍历数组

<div v-for="(item, index) in items"></div>  item为属性值, index为下标,从1开始
<div v-for="(val, key) in object"></div>  key为属性名,val为属性值
<div v-for="(val, name, index) in object"></div> val为属性值 name为属性名 index为下标
    <ul v-for="(p,index) in persons" :key="index">//推荐写上:key属性,值要是元素唯一的
       {{index}}}---{{p.name}}--{{p.age}}}
       <button @click="deletePerson(index)">删除</button>
        <button @click="updatePerson(index,{name:'cat',age:30})">更新</button>
    </ul>

</div>

<script src="https://cdn.jsdelivr.net/npm/vue@2.6.12"></script>
<script>
   var vm =new Vue({
       el:"#app",
       data:{
           firstName:'A',
           lastName:'B',
           fullname:'',
           fullname2:'',
           fullname3:'',
           persons:[{name:"tom",age:18},{name:"tom2",age:20},{name:"tom3",age:22},{name:"tom4",age:24}]
       },
       methods:{
           deletePerson(index){
               this.persons.splice(index,1);//splice可以实现增删改
           },
           updatePerson(index,newP){
               this.persons.splice(index,1,newP);
           }
       }
   });

列表搜索和排序

<div id="app">


    <br/>
    searchName:<input type="text" v-model="searchName"/>
    <ul v-for="(p,index) in filterPersons" :key="index">
       {{index}}}---{{p.name}}--{{p.age}}}
       <button @click="deletePerson(index)">删除</button>
        <button @click="updatePerson(index,{name:'cat',age:30})">更新</button>
    </ul>
    <button @click="setOrderType(1)">年龄升序</button>
    <button @click="setOrderType(2)">年龄降序</button>
    <button @click="setOrderType(0)">原本顺序</button>
</div>

<script src="https://cdn.jsdelivr.net/npm/vue@2.6.12"></script>
<script>
   var vm =new Vue({
       el:"#app",
       data:{
           orderType:0, //0表示原本排序,1代表升序,2代表降序
           searchName:'',
           persons:[{name:"tom",age:18},{name:"tom2",age:20},{name:"tom3",age:22},{name:"tom4",age:24}]
       },
       methods:{
   
           setOrderType(type){
               this.orderType=type;
           }
       },
       computed:{
           filterPersons(){
               //取出相关数据
               const {searchName,persons,orderType} = this; //提前指定了this,  就不需要在后面使用this.searchName this.persons等了
               //最终需要显示的数组
               let fPerson;
              //对persons进行过滤
               fPerson=persons.filter(p => p.name.indexOf(searchName)>=0);
               //p => p.name.indexOf(searchName)>=0  ES6新特性相当于 function(p){return p.name.indexOf(searchName)>=0; }

               if(orderType!=0){
                   fPerson.sort(function (p1,p2) {
                       //1代表升序,2代表降序
                       if(orderType===2){
                           return p2.age - p1.age;// 如果<0,p2在p1前面
                       }else {
                           return p1.age - p2.age;// 如果<0,p1在p2前面
                       }
                   })
               }
              return fPerson;
           }

       }
   });

事件监听

绑定监听

<div id="app">
    <button @click="test1">test1</button>
    <button @click="test2('abc')">test2</button>
    <button @click="test3">test3</button>  <!--test3不写默认为test3($event)-->
    <button @click="test4(0,$event)">test4</button>
</div>

<script src="https://cdn.jsdelivr.net/npm/vue@2.6.12"></script>
<script>
   var vm =new Vue({
       el:"#app",
       data:{
           test1(){alert('test1')},
           test2(msg){alert(msg)},
           test3(event){alert(event.target.innerHTML)},
           test4(number,event){alert(number+'---'+event.target.innerHTML)},
      
       }
      
      );


</script>

事件修饰符和按键修饰符

    <div style="width: 200px;height: 100px;background-color: red" @click="test5">
        <div style="width: 100px;height: 50px;background-color: blue" @click.stop="test6"> 
        <!--stop阻止事件冒泡,也就是说执行test6后,不会执行test5-->
        </div>
    </div>
    <a href="http://www.baidu.com" @click.prevent="test7">去百度</a>
    <!--prevent阻止默认行为,也就是说执行test7后不会跳转到百度-->
    <br/>
   <input type="text" @keyup.enter="test8"> 
   <!--@keyup表示键盘上去时, enter表示enter键-->

</div>

<script src="https://cdn.jsdelivr.net/npm/vue@2.6.12"></script>
<script>
   var vm =new Vue({
       el:"#app",
       data:{
           test5(){alert('test5')},
           test6(){alert('test6')},
           test7(){alert('test7')},
           test8(event){
               alert(event.target.value)}
       }
 
    
     );

表单数组的自动收集

VUE生命周期

1.new Vue () 创建一个实例
2.beforeCreate函数 创建实例后,马上就会调用beforeCreate
3.Observe Data 观察 监视属性值变化
4.Init Events 初始化事件
5.created 函数
6.判断是否有 el 这个属性:
有:自动挂载页面
没有:手动挂载页面
7.是否有配置’ template option ’ ?
有:
没有:解析el属性范围里面的语法
8.beforeMount函数
9.挂载,加载页面
10.mounted函数
到此第一阶段 初始显示 结束
第二阶段 更新 开始
11.页面变化之前调用 :beforeUpdate
12.页面变化之后调用 : updated
第三阶段 vm.$destory() is called
13.beforeDestory函数
14.destroyed函数

过滤器,日期格式化

<div id="app">
原始:<p>{{date}}</p>
完整:<p>{{date | dateString}}</p>
年月日:<p>{{date | dateString('YYYY-MM-DD')}}</p>
时分秒:<p>{{date | dateString('HH:mm:ss')}}</p>
</div>

<script src="https://cdn.jsdelivr.net/npm/vue@2.6.12"></script>
<!--导入moment 时间格式化的包-->
<script src="https://cdn.bootcdn.net/ajax/libs/moment.js/2.10.0/moment.js"></script>
<script>
 <!--自定义过滤器-->
   Vue.filter('dateString',function(value,format='YYYY-MM-DD HH:mm:ss'){ //形参设置默认值
    return moment(value).format(format  )
   });
   
   var vm =new Vue({
       el:"#app",
       data:{
         data:new Date()
       }
 
    
     );
 </script>

剩下的一些指令

ref 为某个元素注册一个唯一标识符,vue对象通过$refs属性访问这个元素对象
v-cloak 使用它防止闪现表达式(就是数据还没加载完,显示的是表达式本身),与css配合:[v-cloak]{display : none}

<style>
[v-cloak]{display : none}   <!--[xx]为CSS属性选择器-->
</style>
<div id="app">
  <p ref="content">abc</p>
  <button @click="hint">提示</button >
   <p v-cloak>{{model}}</p>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.12"></script>
<script>
   var vm =new Vue({
       el:"#app",
       data:{
         model:13
       },
       methods:{
        hint(){
         alert(this.$refs.content.textContent) //可能有多个ref所以是refs
        }
       }    
     );
 </script>

自定义指令


<div id="app">
<p v-upper-text="msg1"></p>
<p v-lower-text="msg1"></p>
</div>

<script src="https://cdn.jsdelivr.net/npm/vue@2.6.12"></script>
<script>
//定义全局指令
//el:指令属性所在标签对象
//binding 包含指令相关信息数据对象
Vue.directive('upper-text',fucnction(el,binding){
 el.textContent = binding.value.toUpperCase();
})

   var vm =new Vue({
       el:"#app",
       data:{
        msg1:'I Love You'
       },
       //定义局部指令 :只在当前VUE实例管理的范围中有效
       deriectives:{
          'lower-text' : function(el,binding){
           el.textContent = binding.value.toLowerCase();
          }
        }
       }    
     );
 </script>

axios

<script src="https://cdn.bootcdn.net/ajax/libs/axios/0.21.0/axios.min.js"></script>
<script>
new Vue({
el:"#app",
data(){
return {
info:{
 name:null,
 address:null
 }
}
},
mounted(){
axios.get('URL').then(response => {this.info=response.data});
}

});

</script>

Vue的组件化编码

插槽slot

进行复用

<slot> </slot>

<script>
Vue.component("todo",{
template:'<div>\
	 <slot name="todo-title"></slot>
	 <ul>\
	   <slot name="">
'
})	

</script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值