Vue学习2 - 事件处理以及绑定、事件、遍历、判断、元素显示、DOM属性的绑定、comput计算属性值

84 阅读3分钟

文章目录

1. 事件处理、以及Vue生命周期函数、事件描述符

1.1 基本用法

事件绑定:v-on:事件名=“函数名或者代码块”
语法:v-on:click 等价于 @click – 简写

<body>
   <div id="app">
      <p>{{num}}</p>
       <button v-on:click="add">增加</button>
   </div>
</body>
<script>
    var vue = new Vue({
        el : "#app",
        data: {
            num: 0
        },
        methods: {

            add: function() {
                this.num++;
            }
        },
        created: function() {
            console.log("vue对象创建成功");
            console.log(this);
        }

    })
</script>


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dVWvXT4X-1587887745408)(en-resource://database/20728:1)]

1.2 获取事件对象,阻止默认行为、事件冒泡行为、事件描述符

获取事件对象,实参 $event

传统阻止默认行为:event对象.preventDefault();

<body>
   <div id="app">
      <p>{{num}}</p>
       <a  href="http://baidu.com" v-on:click="add($event)">增加</a>
   </div>
</body>
<script>
    var vue = new Vue({
        el : "#app",
        data: {
            num: 0
        },
        methods: {
            add: function(e) {
                this.num++;
                e.preventDefault();
            }
        }

    })
</script>


Vue阻止默认行为:v-on:事件名.prevent="函数名"

<a  href="http://baidu.com" v-on:click.prevent="函数名">增加</a>


Vue阻止冒泡行为:v-on:事件名.stop="函数名"

<a  href="http://baidu.com" v-on:click.stop="函数名">增加</a>


类似使用属性段来约束事件、元素的某些行为
语法格式:v-on:事件名.事件描述符

2. for循环

2.1 基本数据类型数组的遍历

<body>
    <div id="app">
        <ul>
            <li v-for="num in nums">{{num}}</li>
        </ul>
    </div>
</body>
<script>
    var vue = new Vue({
        el : "#app",
        data: {
            nums: [1,2,3,4]
        }

    })
</script>


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1O7KVp0S-1587887745415)(en-resource://database/20744:1)]

2.2 对象数组类型的遍历

<body>
    <div id="app">
        <ul>
            <li v-for="student in studnets">姓名:{{student.name}},年龄:{{student.age}}</li>
        </ul>
    </div>
</body>
<script>
    var vue = new Vue({
        el : "#app",
        data: {
            studnets: [{name:"lrc", age: 18}, {name:"lcj", age: 20}, {name:"yxx", age: 19}]
        }

    })
</script>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3DYcJfbV-1587887745423)(en-resource://database/20746:1)]

注意:还有一种写法获取数组的小标值

<script>
    <ul>
        <li v-for="(student,index) in studnets">姓名:{{student.name}},年龄:{{student.age}}, 序号:{{index}}</li>
    </ul>
</script>


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O5TVVxHJ-1587887745430)(en-resource://database/20748:1)]

2.3 对象属性的遍历

<body>
    <div id="app">
        <ul>
            <li v-for="(value,key,index) in student">{{value}} = {{key}}</li>
        </ul>
    </div>
</body>
<script>
    var vue = new Vue({
        el : "#app",
        data: {
            student: {name:"lrc", age: 18}
        }

    })
</script>


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OV4GX74c-1587887745435)(en-resource://database/20750:1)]

2.4 数组的特殊遍历set()

vue实例.data内数组属性[index]=’'不能动态修改到页面显示

<body>
    <div id="vueBox">
      <ul>
          <li v-for="name in names">{{name}}</li>
      </ul>
        <p>{{msg}}</p>
    </div>
</body>

<script type="text/javascript">

    var vue = new Vue({
        el: "#vueBox",
        data: {
           names: ["lrc", "lcj", "yxx"],
            msg:"7978"
        },
    })

    vue.names[2]='直接操纵vue数组属性某个元素不能修改';

</script>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U4ZTbWDR-1587887745441)(en-resource://database/21370:1)]

<body>
    <div id="vueBox">
      <ul>
          <li v-for="name in names">{{name}}</li>
      </ul>
        <p>{{msg}}</p>
    </div>
</body>

<script type="text/javascript">

    var vue = new Vue({
        el: "#vueBox",
        data: {
           names: ["lrc", "lcj", "yxx"],
            msg:"7978"
        },
    })
    Vue.set(vue.names,0,'全局修改');
    vue.$set(vue.names, 1, 'vue实例进行修改');
    vue.names[2]='直接操纵vue数组属性某个元素不能修改';

    vue.msg="非数组元素可以直接操纵属性"
</script>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nfSeDVlH-1587887745445)(en-resource://database/21372:1)]

2.5 对象数据的修改

<script>
    vue实例.对象属性名.对象属性=""  //-- 不能反应到view,只能反应到model
    
    //  model、view同时修改
    vue实例.$set(对象属性名, 对象属性, 修改的值)   
    Vue.set(vue实例.对象属性名, 对象属性, 修改的值)   
</script>

3. DOM元素显示

3.1 v-if判断 - 决定元素是否被渲染

3.1.1 单if判断

决定元素是否会被显示

<body>
    <div id="app">
       <div v-if="isShow" style="border:1px solid black;width:50px;height:50px;" v-on:click="show"></div>
    </div>
</body>
<script>
    var vue = new Vue({
        el : "#app",
        data: {
            isShow: true,
        },
        methods: {
          show: function() {
              this.isShow = false;
          }
        }

    })
</script>


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Wn2U0F4d-1587887745449)(en-resource://database/20758:1)]

3.1.2 多if判断 - if-else

注意:v-else必须紧跟在v-if或者v-else-if后面

<body>
    <div id="app">
       <span v-if="num>0.9">num大于0.9</span>
       <span v-else-if="num>0.8">num大于0.8</span>
       <span v-else>num小于等于0.8</span>
    </div>
</body>
<script>
    var vue = new Vue({
        el : "#app",
        data: {
            num: 0.5
        },

    })
</script>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dsPnXHfQ-1587887745452)(en-resource://database/20760:1)]

等价于 - Java代码

if(num > 0.9) {
}else if ( num > 0.8 ) {
)else {
}

3.1.3 v-for、v-if结合使用
<body>
    <div id="vueBox">

        <ul>
            <li v-for="student in students" v-if="isShow(student)">{{student.name}}:{{student.age}}</li>
        </ul>

    </div>
</body>

<script type="text/javascript">
    var vue = new Vue({

        el: "#vueBox",
        data: {
            students:[{name:'lrc', age:20},{name:'lcj', age:30},{name:'yxx', age:40}]
        },
        methods: {
            isShow: function(student) {
                if(student.age >= 30) {
                    return true;
                }else {
                    return false;
                }
            }
        }

    })
</script>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ix795TDU-1587887745457)(en-resource://database/20884:1)]

等价于Java伪代码

for( Student student : Students) {
    if(student.age > 20 ) { 显示 }
    else { 不显示 }
}

3.2 v-show判断 - 决定元素是否被展示display,已经加载

使用CSS属性 display*

注意:事件绑定中写代码段操纵vue的data属性,不需要写this,否则无反应

<body>
    <div id="app">
        <span style="color:red;" v-show="isShow">你好,世界!</span>
        <button v-on:click="isShow = !isShow">显示</button>
    </div>
</body>
<script>
    var vue = new Vue({
        el: "#app",
        data: {
            isShow: true,
        },

    })
</script>


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tjdWIhRx-1587887745461)(en-resource://database/20762:1)]

4. DOM元素属性值的绑定 - v-bind

class属性处理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bGbWfHNv-1587887745464)(en-resource://database/21246:1)]

语法:v-bind:属性=“date属性名” 等价于 :属性=“data属性名” *

<head>
    <meta charset="UTF-8">
    <title>Vue测试</title>
    <script src="./node_modules/vue/dist/vue.min.js"></script>

    <style>
        .one {
            color: red;
        }

        .two {
            font-size: 30px;
        }
    </style>

</head>
<body>
    <div id="app">
        <span v-bind:class="styleClass">你好,世界!</span>

        <br>

        <span v-bind:class="{one:hasOne, two:hasTwo}">你好,世界!</span>
    </div>
</body>
<script>
    var vue = new Vue({
        el: "#app",
        data: {
            styleClass: ["one", "two"],
            hasOne: true,
            hasTwo: false
        },

    })
</script>


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6i9dl0sS-1587887745472)(en-resource://database/20764:1)]

style属性处理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Fnick3Xw-1587887745476)(en-resource://database/21252:1)]

<body>
    <div id="vueBox">
       <div v-bind:style="{border:borderStyle, width:widthStyle, height: heightStyle}"></div>
    </div>
</body>

<script type="text/javascript">

    var vue = new Vue({
        el: "#vueBox",
        data: {
            borderStyle: '1px solid black',
            widthStyle: '50px',
            heightStyle: '50px'
        },
    })
</script>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0tlKSa3k-1587887745479)(en-resource://database/21248:1)]

5. 计算vue实例中属性值 - comput

methods与computed的区别,前者无缓存,后者有缓存

由结果可知:

  1. computed属性的方法在使用时可以不直接声明调用,直接写函数名即可
  2. methods属性的方法则必须写函数名()进行调用
<body>
    <div id="vueBox">
        <p>{{new Date().getFullYear()+"年" + (new Date().getMonth()+1) + "月" + new Date().getDate() + "日"}}</p>
        <p>{{date.getFullYear()+"年" + (date.getMonth()+1) + "月" + date.getDate() + "日"}}</p>
        <p>{{date2()}}</p>
        <p>{{date1}}</p>

    </div>
</body>

<script type="text/javascript">

    var vue = new Vue({
        el: "#vueBox",
        data: {
            date: new Date()
        },
        methods: {
            date2:function() {
                var date = this.date;
                return date.getFullYear()+"年" + (date.getMonth()+1) + "月" + date.getDate() + "日"
            }
        },
        computed: {

            date1:function() {
                var date = this.date;
                return date.getFullYear()+"年" + (date.getMonth()+1) + "月" + date.getDate() + "日"
            }

        }

    })

</script>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9GB75Ldu-1587887745483)(en-resource://database/20886:1)]