vue--常用指令和事件修饰符(三)

简介: vue--常用指令和事件修饰符

v-model


双向绑定,当用户输入的时候,改变原来的值,只能应用在像input,textare,select之类的标签

v-model也叫双向数据绑定

例子一:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <script src="./node_modules/vue/dist/vue.js"></script>
</head>
<body>
        <div id="demo">
                <!-- @submit.prevent 阻止事件的默认行为,当前阻止的是action行为 -->
            <form action="#" @submit.prevent="submitForm">
                姓名(文本):<input type="text" v-model="name">
                <br><br>
                性别(单选按钮):
                    <input name="sex" type="radio" value="1" v-model="sex"/>男
                    <input name="sex" type="radio" value="0" v-model="sex"/>女
                <br><br>
                技能(多选框):
                    <input type="checkbox" name="skills" value="java" v-model="skills">Java开发
                    <input type="checkbox" name="skills" value="vue" v-model="skills">Vue.js开发
                    <input type="checkbox" name="skills" value="python" v-model="skills">Python开发
                <br><br>
                城市(下拉框):
                <!-- 绑定在select上才会默认选中 -->
                <select name="citys" v-model="city">  
                    <option v-for="c in citys" :value="c.code">
                        {{c.name}}
                    </option>
                </select>
                <br><br>
                说明(多行文本):<textarea cols="30" rows="5" v-model="desc"></textarea>
                <br><br>
                <button type="submit" >提交</button>
            </form>
        </div>
        <script>
            new Vue({
                el: '#demo',
                data: {
                    name: '',
                    sex: '1',   //默认选中的是 男
                    skills: ['vue', 'python'], //默认选中 Vue.js开发 、Python开发
                    citys: [
                        {code: 'bj', name: '北京'},
                        {code: 'sh', name: '上海'},
                        {code: 'gz', name: '广州'}
                    ],
                    city: 'sh', // 默认选中的城市:上海
                    desc: ''
                },
                methods: {
                    submitForm: function () { //处理提交表单
                        //发送ajax异步处理
                        alert(this.name + ', ' + this.sex + ', ' + this.skills +  ', ' + this.city + ', ' + this.desc)
                    }
                }
            })
        </script>
    </body>
</html>

例子二:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <script src="./node_modules/vue/dist/vue.js"></script>
</head>
<body>
    <div id="app">
        <!-- {{}}用于标签体内显示数据 -->
        hello,{{ msg }}
        <br>
        <!-- v-model进行数据的双向绑定 -->
        <input type="text" v-model="msg">
    </div>
    <script >
        new Vue({
            el: "#app",  //指定被Vue管理的入口, 值为选择器, 不可以指定body或者是html
            data: {    // 用于初始化数据,在Vue实例管理的Dom节点下,可通过模板语法来引用
                msg: "vue.js"  
            }
        })
    </script>
</body>
</html>

会把msg的信息显示在输入框和div标签里,更改输入框里的数据,div里的也会跟着改,所以叫双向数据绑定


计算属性


computed 选项定义计算属性

计算属性 类似于  methods 选项中定义的函数

  • 计算属性 会进行缓存,只在相关响应式依赖发生改变时它们才会重新求值。
  • 函数 每次都会执行函数体进行计算。

输入数学与英语分数,采用  methods 与  computed 分别计算出总得分

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <div id="app">
        数学:<input type="text" v-model="mathScore">
        英语:<input type="text" v-model="englishScore"><br>
        <!-- v-model调用函数时,不要少了小括号 -->
        总得分(函数-单向绑定):<input type="text" v-model="sumScore()"><br>
        <!-- 绑定计算属性后面不加上小括号 -->
        总得分(计算属性-单向绑定):<input type="text" v-model="sumScore1"><br>
        总得分(计算属性-双向绑定):<input type="text" v-model="sumScore2">
    </div>
    <script src="./node_modules/vue/dist/vue.js"></script>
    <script>
        /* 
        1. 函数没有缓存,每次都会被调用
        2. 计算属性有缓存 ,只有当计算属性体内的属性值被更改之后才会被调用,不然不会被调用
        3. 函数只支持单向
        4. 计算属性默认情况下:只有getter函数,而没有setter函数,所以只支持单向
            如果你要进行双向,则需要自定义setter函数
        */
        var vm = new Vue({
            el: '#app',
            data: {
                mathScore: 80,
                englishScore: 90,
            },
            methods: {
                sumScore: function () { //100
                    console.log('sumScore函数被调用')
                    // this 指向的就是 vm 实例 , 减0是为了字符串转为数字运算
                    return (this.mathScore-0) + (this.englishScore-0)
                }
            },
            computed: { //定义计算属性选项
                //这个是单向绑定,默认只有getter方法
                sumScore1: function () { //计算属性有缓存,如果计算属性体内的属性值没有发生改变,则不会重新计算,只有发生改变 的时候才会重新计算
                    console.log('sumScore1计算属性被调用')
                    return (this.mathScore-0) + (this.englishScore-0)
                },
                sumScore2: { //有了setter和getter之后就可以进行双向绑定
                    //获取数据
                    get: function() {
                        console.log('sumScore2.get被调用')
                        return (this.mathScore-0) + (this.englishScore-0)
                    },
                    //设置数据, 当 sumScore2 计算属性更新之后 ,则会调用set方法
                    set: function(newValue) { // newVulue 是 sumScore2 更新之后的新值
                        console.log('sumScore2.set被调用')
                        var avgScore = newValue / 2
                        this.mathScore = avgScore
                        this.englishScore = avgScore
                    }
                }
            },
        })
    </script>
</body>
</html>

computed 选项内的计算属性默认是 getter 函数,所以上面只支持单向绑定,当修改数学和英语的数据才会更新总分,而修改总分不会更新数据和英语

 

如果是用户输入的,那会直接拼接起来,因为用户输入的数字也会被当成字符串。可以使用number来解决这个问题

<td><input type="text" v-model.number="python" /></td>
<td><input type="text" v-model.number="vue"></td>
<td><input type="text" v-model.number="selenium"></td>

上面当我们输入时,vue会监听我们输入的内容,这样大大降低了性能,我们可以使用lazy,当失去光标的时候再执行

<td><input type="text" v-model.number.lazy="python" /></td>
<td><input type="text" v-model.number.lazy="vue"></td>
<td><input type="text" v-model.number.lazy="selenium"></td>


实战


图片切换(图片放自己的路径)

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta http-equiv="content-Type" charset="UTF-8">
    <title>Title</title>
<!--    引用vue-->
    <script src="../static/vue.min.js"></script>
</head>
<body>
    <div id="app">
        <img :src="images[currenIndex].imageSrc" alt=""><!--    按索引取图片-->
        <br>
        <button @click="preImage">上一张</button> <!--  绑定点击事件-->
        <button @click="nextImage">下一张</button>
    </div>
    <script>
        new Vue({
            el:"#app",
            data(){
                return{
                    images:[
                        {id:1,imageSrc:"../image/1.jpg"},
                        {id:2,imageSrc:"../image/2.jpg"},
                        {id:3,imageSrc:"../image/3.jpg"},
                    ],
                    currenIndex:0
                }
            },
            methods:{  <!--    点击下一张按钮时调用这个方法-->
                nextImage(){
                    this.currenIndex++;
                    if (this.currenIndex == 3){
                        this.currenIndex=0;
                    }
                },
                preImage(){
                    if (this.currenIndex == 0) {
                        this.currenIndex=3;
                    }
                    this.currenIndex--;
                }
            },
            created(){ //组件,ajax
                setInterval(()=>{
                    this.currenIndex++;
                    if (this.currenIndex == 3){
                        this.currenIndex=0;
                    }
                },2000)
        }
        })
    </script>
</body>
</html>

相关文章
|
25天前
|
JavaScript API 开发者
Vue是如何进行组件化的
Vue是如何进行组件化的
|
1天前
|
JavaScript 关系型数据库 MySQL
基于VUE的校园二手交易平台系统设计与实现毕业设计论文模板
基于Vue的校园二手交易平台是一款专为校园用户设计的在线交易系统,提供简洁高效、安全可靠的二手商品买卖环境。平台利用Vue框架的响应式数据绑定和组件化特性,实现用户友好的界面,方便商品浏览、发布与管理。该系统采用Node.js、MySQL及B/S架构,确保稳定性和多功能模块设计,涵盖管理员和用户功能模块,促进物品循环使用,降低开销,提升环保意识,助力绿色校园文化建设。
|
25天前
|
JavaScript 前端开发 开发者
Vue是如何劫持响应式对象的
Vue是如何劫持响应式对象的
23 1
|
25天前
|
JavaScript 前端开发 开发者
Vue是如何进行组件化的
Vue是如何进行组件化的
|
25天前
|
存储 JavaScript 前端开发
介绍一下Vue的核心功能
介绍一下Vue的核心功能
|
27天前
|
JavaScript 前端开发 开发者
vue 数据驱动视图
总之,Vue 数据驱动视图是一种先进的理念和技术,它为前端开发带来了巨大的便利和优势。通过理解和应用这一特性,开发者能够构建出更加动态、高效、用户体验良好的前端应用。在不断发展的前端领域中,数据驱动视图将继续发挥重要作用,推动着应用界面的不断创新和进化。
|
29天前
|
JavaScript 前端开发 开发者
vue学习第一章
欢迎来到我的博客!我是瑞雨溪,一名热爱前端的大一学生,专注于JavaScript与Vue,正向全栈进发。博客分享Vue学习心得、命令式与声明式编程对比、列表展示及计数器案例等。关注我,持续更新中!🎉🎉🎉
32 1
vue学习第一章
|
29天前
|
JavaScript 前端开发 索引
vue学习第三章
欢迎来到瑞雨溪的博客,一名热爱JavaScript与Vue的大一学生。本文介绍了Vue中的v-bind指令,包括基本使用、动态绑定class及style等,希望能为你的前端学习之路提供帮助。持续关注,更多精彩内容即将呈现!🎉🎉🎉
26 1
vue学习第三章
|
29天前
|
缓存 JavaScript 前端开发
vue学习第四章
欢迎来到我的博客!我是瑞雨溪,一名热爱JavaScript与Vue的大一学生。本文介绍了Vue中计算属性的基本与复杂使用、setter/getter、与methods的对比及与侦听器的总结。如果你觉得有用,请关注我,将持续更新更多优质内容!🎉🎉🎉
35 1
vue学习第四章
|
29天前
|
JavaScript 前端开发 算法
vue学习第7章(循环)
欢迎来到瑞雨溪的博客,一名热爱JavaScript和Vue的大一学生。本文介绍了Vue中的v-for指令,包括遍历数组和对象、使用key以及数组的响应式方法等内容,并附有综合练习实例。关注我,将持续更新更多优质文章!🎉🎉🎉
24 1
vue学习第7章(循环)
下一篇
DataWorks