zoukankan      html  css  js  c++  java
  • day77 vue对象提供的属性功能

    一、过滤器

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

    易错点:全局是filter,局部是filters

    <div id="d1">
    <p>{{price|format}}</p>
    </div>
    <script>
        // 全局过滤器,可以在任意位置使用,四舍五入
        Vue.filter('format',function (money) {
                return money.toFixed(2)
        })
        let vm = new Vue({
            el:'#d1',
            data:{
                price:1.055111
            },
            filters:{
            // 局部过滤器,只能在当前vm对象内使用
                format:function (money) {
                    return money.toFixed(3)
                }
            }
        })
    </script>
    

    二、计算属性(computed)

    当我们需要数据进行某种操作加工,就可以用到计算属性

    ps:计算属性的函数必须要有返回值

    <div id="d1">
        <input type="text" v-model="num1">+
        <input type="text" v-model="num2">=
        <span>{{total}}</span>
    </div>
    
    <script>
        let vm = new Vue({
            el:"#d1",
            data:{
                num1:0,
                num2:0,
            },
            computed:{
                total(){
                    return parseFloat(this.num1) + parseFloat(this.num2);
                }
            }
        })
    </script>
    

    三、侦听属性(watch)

    侦听data中的某个数据,当这个数据发生变化了,就执行某些自定义操作

    侦听属性一般是一个对象(键值对),他的键通常是一个对象或者变量,值一般是函数,当侦听的data数据发生变化,就会自动执行后面的函数,这个函数在调用的时候会自动传入两个参数,第一个是变化前的值,第二个是变化后的值。

    <div id="app">
        <p @click="num++">{{num}}</p>
    </div>
    
    <script>
        let vm = new Vue({
            el:'#app',
            data:{
                num:0
            },
            watch:{
                // v1是变化之前的值,v2是变化之后的值
                num(v1,v2){
                    if(this.num>=5){
                        this.num=5
                    }
                }
            }
        })
    </script>
    

    四、vue对象的生命周期

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

    • beforeCreate(创建前)

      • 此时vm对象还没创建,内部的属性,方法一概没有
    • created(创建后)

      • vm对象创建完成,内部的方法(watch,filters。。),属性(data)已经完成实例化,但是此时还未挂载,所以vm对象范围还没有创建(el)
    • beforeMount(挂载前)

      • 页面还没有被展示但是dom操作已经完成

      • <div id='app'>{{msg}}</div>
        
    • mounted(挂载后)

      • 数据展示到页面上

      • <div id='app'>{{123}}</div>
        
    • beforeUpdate(数据更新前)

      • 在数据跟新的时候发生调用,在新的dom渲染和打补丁之前,这里执行的代码不会重新触发数据更新
    • update(数据更新后)

      • dom操作已经渲染完毕,但是这个状态应该避免,如果这里触发了数据更新,就会无限重复这个更新
    • beforeDestroy(销毁前)

      • 实例销毁之前调用。在这一步,实例仍然完全可用。
    • destroyed(销毁后)

      • 所有实例被销毁
    <!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
    

    五、阻止事件冒泡和刷新页面

    绑定事件的时候添加.stop、.prevent

    <div id="app" style=" 100px;height: 100px;background-color: red" @click="show('box1')">
        <div style="background-color: black;height: 80px; 80px" @click.stop="show('box2')"></div>
    </div>
    <a href="https://www.mzitu.com/" @click.prevent.stop="show(123)" >百度</a>
    <script>
        let vm = new Vue({
            el:'#app',
            methods:{
                show(message){
                    alert(message)
                }
            }
        })
    </script>
    

    六、综合案例-todolist

    <!DOCTYPE html>
    <html lang="en">
    <head>
    	<meta charset="UTF-8">
    	<title>todolist</title>
        <script src="/vue/vue.js"></script>
    	<style type="text/css">
    		.list_con{
    			600px;
    			margin:50px auto 0;
    		}
    		.inputtxt{
    			550px;
    			height:30px;
    			border:1px solid #ccc;
    			padding:0px;
    			text-indent:10px;
    		}
    		.inputbtn{
    			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" v-model="msg" id="txt1" class="inputtxt">
    		<input type="button" @click="add" value="增加" id="btn1" class="inputbtn">
    
    		<ul id="list" class="list">
    <!--			&lt;!&ndash; javascript:; # 阻止a标签跳转 &ndash;&gt;-->
    <!--			<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>-->
                <li v-for="li,index in li_list">
                    <span>{{li}}</span>
                    <a @click="up(index)">↑</a>
                    <a @click="down(index)">↓</a>
                    <a @click="del(index)">删除</a>
                </li>
    		</ul>
    	</div>
    
        <script>
            let vm = new Vue({
                el:'.list_con',
                data:{
                    msg:'',
                    li_list : ['学习html','学习css','学习python']
                },
                methods:{
                    add(){
                        if(this.msg==""){
                            return false;
                        }
                        this.li_list.push(this.msg);
                        this.msg='';
                    },
                    up(index){
                        if(index==0){
                            return false;
                        }
                        // 这里删除得到的是一个数组,因为可能删除多个
                        let message = this.li_list.splice(index,1)
                        this.li_list.splice(index-1,0,message[0])
                    },
                    down(index){
                        if(index==this.li_list.length){
                            return false;
                        }
                        let message = this.li_list.splice(index,1)
                        this.li_list.splice(index+1,0,message[0])
                    },
                    del(index){
                        this.li_list.splice(index,1)
                    }
                }
            })
        </script>
    </body>
    </html>
    
  • 相关阅读:
    设计模式目录
    垃圾收集器
    598. Range Addition II
    Java中的四种引用
    垃圾回收算法
    645. Set Mismatch
    java 8中撤销永久代,引入元空间
    L2-013. 红色警报 (并查集)
    POJ 1127 Jack Straws (线段相交)
    L2-014. 列车调度 (DP)
  • 原文地址:https://www.cnblogs.com/hz2lxt/p/13154255.html
Copyright © 2011-2022 走看看