随笔 - 77  文章 - 0  评论 - 0  阅读 - 21363 

3. Vue对象提供的属性功能

3.1 过滤器

过滤器,就是vue允许开发者自定义的文本格式化函数,可以使用在两个地方:输出内容和操作数据中。

定义过滤器的方式有两种。

3.1.1 使用Vue.filter()进行全局定义

Vue.filter("RMB1", function(v){
//就是来格式化(处理)v这个数据的
if(v==0){
  return v;
}

return v+"元";
})

 

3.1.2 在vue对象中通过filters属性来定义

var vm = new Vue({
 el:"#app",
 data:{},
 filters:{
   RMB2:function(value){
     if(value==''){
       return;
    }else{
    return '¥ '+value;
    }
  }
}
});
总结:
1. 一个数据可以调用多个过滤器,每个过滤器之间使用 "|"竖杠隔开,但是过滤器之间的执行顺序是从左往右执行,所以有可能产生冲突问题.这时候可以尝试调整调用过滤器之间的顺序

2. 过滤器本质上就是一个函数,所有我们必须有返回值,否则数据调用了过滤器以后,无法得到处理后的数据结果
3. vue1.x版本时,有内置过滤器的,但是官方认为,过多的封装工具给开发者使用,会容易造成框架本身的臃肿,所以在vue2.x版本以后又废除了.
4. 过滤器本质上来说就是函数,所以函数不仅只有一个参数的.我们过滤器也支持多个参数的写法.

 

带参数的过滤器
<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <title>Title</title>
   <script src="js/vue.js"></script>
   <script src="js/filters.js"></script>
</head>
<body>
<div id="app">
{{price | kdot(3) | RMB }}
</div>
<script>
   // 通过vm对象内部的filters属性进行局部声明,过滤器只能用于当前vm实例对象
   var vm = new Vue({
       el:"#app",
       data:{
           price: 10.333333,
      },
       filters:{
           // "过滤器名称": function(){
           //     // 过滤器执行的代码
           // }
           kdot(data,num){
               return data.toFixed(num)
          }
      }
  })
</script>
</body>
</html>

 

 

3.4 计算和侦听属性

3.4.1 计算属性

我们之前学习过字符串反转,如果直接把反转的代码写在元素中,则会使得其他同事在开发时时不易发现数据被调整了,所以vue提供了一个计算属性(computed),可以让我们把调整data数据的代码存在在该属性中。

<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <title>Title</title>
   <script src="js/vue.js"></script>
</head>
<body>
   <div id="app">
      苹果单价:{{price}}元<br>
       <input type="text" v-model="weight">斤<br>
      总计:{{total}}元
   </div>
   <script>
       // 通过计算属性computed产生一个新的变量给模板使用
       var vm = new Vue({
          el:"#app",
          data:{
              price: 3.5,
              weight: 10,
          },
          computed:{ // 计算属性
              total(){ // 新的变量
                  return this.weight * this.price;
              }
          }
      });
   </script>
</body>
</html>

 

3.4.2 监听属性

侦听属性,可以帮助我们侦听data某个数据的变化,从而做相应的自定义操作。

侦听属性是一个对象,它的键是要监听的对象或者变量,值一般是函数,当侦听的data数据发生变化时,会自定执行的对应函数,这个函数在被调用时,vue会传入两个形参,第一个是变化前的数据值,第二个是变化后的数据值。

<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <title>Title</title>
   <script src="js/vue.js"></script>
   <style>
   .border{
       border:2px solid blue;
  }
   </style>
</head>
<body>
   <div id="app">
       <button @click="num++">+</button>
       <input type="text" v-model="num" :class="{border:border_status}">
       <button @click="num--">-</button>
   </div>
   <script>
       // 侦听属性[watch],也叫监听属性,主要的作用就是为了实时监听变量的变化,在变量发生改变时候,执行其他的代码操作
       var vm = new Vue({
          el:"#app",
          data:{
              num: 0,
              border_status:false,
          },
          watch:{
              // 监听的变量名(){
                    // 变量发生值改变时,需要执行的代码
                    // 一般这里写的要么是ajax,要么就是改变其他相关变量的代码
              // }
              num(){
                  // 判断num如果小于0,则弹出一个信息让用户不能设置小于的数值
                  if(this.num<0){
                      alert("对不起,num不能小于0"); // 这里是js提供的弹窗
                      this.num = 0;
                  }
                  // 如果num的值超过了10,则输入框的边框颜色改成蓝色
                  if(this.num>=10){
                      this.border_status = true;
                  }else{
                      this.border_status = false;
                  }
              },
          },
      });
   </script>
</body>
</html>

 

前端面试常问:在用户输入url地址以后,浏览器都干了什么?

1. 拼接url地址
2. 把url地址发送到dns域名解析服务器[网络世界中,通过不是域名,而是IP]
3. 完成tcp/udp的发送过来
4. 读取网页的原始内容
5. 把网页的html代码转换成浏览器识别的html dom结构对象
6. 把标签的属性逐一完成渲染
7. 把css的代码读取
8. 把css的样式添加到dom结构对象中[DOM树]
9. 页面渲染[执行js操作]

 

3.5 vue对象的生命周期

每个Vue对象在创建时都要经过一系列的初始化过程。在这个过程中Vue.js会自动运行一些叫做生命周期的的钩子函数,我们可以使用这些函数,在对象创建的不同阶段加上我们需要的代码,实现特定的功能。

<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <title>Title</title>
   <script src="js/vue.min.js"></script>
   <script>
   window.onload = function(){
       var vm = new Vue({
           el:"#app",
           data:{
               num:0
          },
           beforeCreate:function(){
               console.log("beforeCreate,vm对象尚未创建,num="+ this.num);  //undefined
               this.name=10; // 此时没有this对象呢,所以设置的name无效,被在创建对象的时候被覆盖为0
          },
           created:function(){
               console.log("created,vm对象创建完成,设置好了要控制的元素范围,num="+this.num );  // 0
               this.num = 20;
          },
           beforeMount:function(){
               console.log( this.$el.innerHTML ); // <p>{{num}}</p>
               console.log("beforeMount,vm对象尚未把data数据显示到页面中,num="+this.num ); // 20
               this.num = 30;
          },
           mounted:function(){
               console.log( this.$el.innerHTML ); // <p>30</p>
               console.log("mounted,vm对象已经把data数据显示到页面中,num="+this.num); // 30
          },
           beforeUpdate:function(){
               // this.$el 就是我们上面的el属性了,$el表示当前vue.js所控制的元素#app
               console.log( this.$el.innerHTML );  // <p>30</p>
               console.log("beforeUpdate,vm对象尚未把更新后的data数据显示到页面中,num="+this.num); // beforeUpdate----31
               
          },
           updated:function(){
               console.log( this.$el.innerHTML ); // <p>31</p>
               console.log("updated,vm对象已经把过呢更新后的data数据显示到页面中,num=" + this.num ); // updated----31
          },
      });
  }
   </script>
</head>
<body>
   <div id="app">
       <p>{{num}}</p>
       <button @click="num++">按钮</button>
   </div>
</body>
</html>

 

总结:

在vue使用的过程中,如果要初始化操作,把初始化操作的代码放在 mounted 中执行。
mounted阶段就是在vm对象已经把data数据实现到页面以后。一般页面初始化使用。例如,用户访问页面加载成功以后,就要执行的ajax请求。

另一个就是created,这个阶段就是在 vue对象创建以后,把ajax请求后端数据的代码放进 created

 

在js中操作事件时,经常会遇到父子元素之间同名事件,会连动执行的。

 

3.2 阻止事件冒泡和刷新页面

事件绑定时,如果同时给父子元素绑定同名事件,则在子元素触发事件以后,父元素的同名事件也会触发到,这种现象就是事件冒泡.

好处:一个触发,多次执行

利用事件冒泡的好处,可以实现事件委托.

坏处:形成事件的联动反应.

使用.stop和.prevent

 

<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <title>Title</title>
   <style>
       .box1{
           width: 200px;
           height: 200px;
           background: #ccc;
      }
       .box2{
           width: 100px;
           height: 100px;
           background: pink;
      }
   </style>
   <script src="js/vue.min.js"></script>
   <script>
   window.onload = function(){
       var vm = new Vue({
           el:"#app",
           data:{}
      })        
  }
   </script>
</head>
<body>
   <div id="app">
       <div class="box1" @click="alert('box1')">
           <div class="box2" @click.stop.prevent="alert('box2')"></div>   <!-- @click.stop来阻止事件冒泡 -->
       </div>

       <form action="#">
           <input type="text">
           <input type="submit">
           <input type="submit" value="提交02" @click.prevent=""> <!-- @click.prevent来阻止表单提交 -->
       </form>
   </div>

</body>
</html>

 

3.3 综合案例-todolist

我的计划列表

html代码:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>todolist</title>
<style type="text/css">
.list_con{
width:600px;
margin:50px auto 0;
}
.inputtxt{
width:550px;
height:30px;
border:1px solid #ccc;
padding:0px;
text-indent:10px;
}
.inputbtn{
width:40px;
height:32px;
padding:0px;
border:1px solid #ccc;
}
.list{
margin:0;
padding:0;
list-style:none;
margin-top:20px;
}
.list li{
height:40px;
line-height:40px;
border-bottom:1px solid #ccc;
}

.list li span{
float:left;
}

.list li a{
float:right;
text-decoration:none;
margin:0 10px;
}
</style>
</head>
<body>
<div class="list_con">
<h2>To do list</h2>
<input type="text" name="" id="txt1" class="inputtxt">
<input type="button" name="" value="增加" id="btn1" class="inputbtn">

<ul id="list" class="list">
<!-- javascript:; # 阻止a标签跳转 -->
<li>
<span>学习html</span>
<a href="javascript:;" class="up"> ↑ </a>
<a href="javascript:;" class="down"> ↓ </a>
<a href="javascript:;" class="del">删除</a>
</li>
<li><span>学习css</span><a href="javascript:;" class="up"> ↑ </a><a href="javascript:;" class="down"> ↓ </a><a href="javascript:;" class="del">删除</a></li>
<li><span>学习javascript</span><a href="javascript:;" class="up"> ↑ </a><a href="javascript:;" class="down"> ↓ </a><a href="javascript:;" class="del">删除</a></li>
</ul>
</div>
</body>
</html>

 

特效实现效果:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>todolist</title>
   <script src="js/vue.js"></script>
<style type="text/css">
.list_con{
width:600px;
margin:50px auto 0;
}
.inputtxt{
width:550px;
height:30px;
border:1px solid #ccc;
padding:0px;
text-indent:10px;
}
.inputbtn{
width:40px;
height:32px;
padding:0px;
border:1px solid #ccc;
}
.list{
margin:0;
padding:0;
list-style:none;
margin-top:20px;
}
.list li{
height:40px;
line-height:40px;
border-bottom:1px solid #ccc;
}

.list li span{
float:left;
}

.list li a{
float:right;
text-decoration:none;
margin:0 10px;
}
</style>
</head>
<body>
<div id="ToDoList" class="list_con">
<h2>To do list</h2>
<input type="text" v-model="plan" id="txt1" class="inputtxt">
<input type="button" name="" value="增加" @click="add_data" id="btn1" class="inputbtn">

<ul id="list" class="list">
<li v-for="item,key in data_list">
<span>{{item.title}}</span>
<a href="javascript:;" @click="move_up(key)" class="up"> ↑ </a>
<a href="javascript:;" @click="move_down(key)" class="down"> ↓ </a>
<a href="javascript:;" @click="del_data(key)" class="del">删除</a>
</li>
</ul>
</div>
   <script>

   // 4. 当用户点击"↑",则需要把当前一行和上一行数据之间的位置,进行互换

   // 5. 当用户点击"↓",则需要把当前一行和下一行数据之间的位置,进行互换
   var vm = new Vue({
       el: "#ToDoList",
       data:{
           plan:"",
           data_list:[
              {"title":"学习html"},
              {"title":"学习css"},
              {"title":"学习javascript"},
              {"title":"学习python"},
          ]
      },
       methods:{
           // 添加计划
           add_data(){
               if( this.plan.length > 0 ){
                   // this.data_list.push({"title":this.plan});   // 追加
                   this.data_list.unshift({"title":this.plan}); // 前置插入
              }
          },
           // 删除计划
           del_data(index){
               // console.log(index)
               // console.log( this.data_list[index] );
               // 可以使用js原生的数组方法来完成删除指定下表的成员
               // 数组.splice(开始截取的下表,截取的成员数量,替换的成员)
               this.data_list.splice(index,1); // 截取
          },
           // 向上移动计划
           move_up(index){
               if(index>0){
                   // 先把当前要移动的计划提取出来
                   current = this.data_list.splice(index,1)[0];
                   console.log(current);
                   // 把提取出来的计划放到index-1的位置
                   this.data_list.splice(index-1,0,current);
              }
          },
           // 向下移动计划
           move_down(index){
               // 先把当前要移动的计划提取出来
               current = this.data_list.splice(index,1)[0];
               // 把提取出来的计划放到index+1的位置
               this.data_list.splice(index+1,0,current);
          }
      }
  })
   </script>
</body>
</html>

 

 

posted on   rider_yang  阅读(42)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示