vue基础

vue实例生命周期

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>生命周期</title>
    <script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
</head>
<body>
    <div id="container" v-cloak>
        <h3>{{greeting}}</h3>
        <button @click="updateFunc">更新实例</button>
        <button @click="destroy">销毁实例</button>
    </div>
    <script type="text/javascript">
        /**
         *   Vue实生命周期中的钩子函数,是作为实例的选项存在的
         */
        var app =  new Vue({
            el:"#container",
            data:{
                greeting:"hello,world!"
            },
            methods:{
                // 数据更新,会触发beforeUpdate以及update钩子函数
                updateFunc:function(){
                    this.greeting = "嗨,大家好!"
                },
                // 销毁实例,会触发beforeDestroy和destroyed钩子函数
                destroy:function(){
                    this.$destroy()//实例.$destroy(),用来销毁实例,释放内存空间
                }
            },
            beforeCreate:function(){
                console.log(this.$el);
                alert("此时Vue实例被创建,但是却没有开始观测(并监视)数据和初始化事件,也就是说此时只是有一个Vue实例的空壳子")
            },
            created:function(){//常用,可以用来进行数据的初始化
                console.log(this.$el);
                alert("此时Vue实例已经被创建,而且完成了数据的观测和事件的初始化")
            },
            beforeMount:function(){
                console.log(this.$el);
                alert("模板编译之前,此时还没有将数据挂载到元素上")
            },
            mounted:function(){//常用,
                console.log(this.$el);
                alert("模板已经完成了编译和已经挂载,此时才开始渲染界面,并显示到页面上")
            },
            beforeUpdate:function(){
                console.log(this.$el);
                alert("实例更新之前,在这里所谓的更新,实例上任意一部分更新均会触发此函数,在这里是更新了数据")
            },
            updated:function(){
                console.log(this.$el);
                alert("实例更新之后")
            },
            beforeDestroy:function(){
                console.log(this.$el);
                alert("实例销毁之前,所谓的销毁就是该实例所拥有的内存空间被释放和销毁")
            },
            destroyed:function(){
                console.log(this.$el);
                alert("实例销毁之后")
            }
        })
    </script>
</body>
</html>

计算属性和侦听器

<body>
    <div id="root">
        {{fullname}} {{age}}
    </div>

    <script>
        var app = new Vue({
            el: "#root",
            data: {
                firstName: "hello",
                lastName: "world",
                age: 28
            },
            computed: {
                fullname: function () {
                    console.log("计算了一次");
                    return this.firstName + "  " + this.lastName
                }
            }
        })
    </script>
</body>

通过computed方法来进行计算,减少数据的冗余,

计算属性有缓存机制,当计算属性的值未发生改变时,计算属性不会执行

通过方法来计算fullname的值

<div id="root">
        {{fullname()}} {{age}}
    </div>
methods: {
    fullname: function () {
        console.log("计算了一次");
        return this.firstName + "  " + this.lastName
    }
},

通过方法也可以实现该功能,但是方法实现的没有缓存机制

通过侦听器来实现该功能

watch: {
    firstName: function (val) {
        console.log("计算了一次");
      this.fullName = val + ' ' + this.lastName
    },
    lastName: function (val) {
        console.log("计算了一次");
      this.fullName = this.firstName + ' ' + val
    }
}

侦听器具有缓存属性,但是代码相比较计算属性来说冗余

setter 和 getter

computed: {
      fullName: {
        // getter
        get: function () {
          return this.firstName + ' ' + this.lastName
        },
        // setter
        set: function (newValue) {
          var names = newValue.split(' ')
          this.firstName = names[0]
          this.lastName = names[names.length - 1]
        }
      }
}

条件渲染

    <div id="app" @click="handleClick">
        <div v-if="show">{{content}}</div>
        <div v-show="show">{{content}}</div>
    </div>

    <script>
        // var dom = document.getElementById("app");
        // dom.innerText = "hello,world"
        var app = new Vue({
            el: "#app",
            data: {
                show: true,
                content: "hello,world"
            },
            methods: {
                handleClick: function () {
                    this.show = !this.show
                }
            }
        })
    </script>

v-if 和 v-show 的区别在于,
v-show只是改变了样式<div style="display: none;">hello,world</div>
并没有从dom中删除,v-if则从dom中删除了

    <div id="app">
        <div v-if="show">
            用户名 : <input type="text" key="name">
        </div>
        <div v-else>
            邮箱 : <input type="text" key="email">
        </div>
    </div>

通过给标签添加key值的方法来解决缓存问题,如果不添加key,当在一个标签中输入数值时,改变show的值,另一个输入框中会出现数据

posted @ 2018-07-19 16:18  寒菱  阅读(121)  评论(0编辑  收藏  举报