首页 > 其他分享 >Vue3的学习---3

Vue3的学习---3

时间:2024-07-29 22:07:59浏览次数:7  
标签:学习 goods return methods Vue --- num Vue3 computed

3.Vue进阶

3.1 Vue方法、计算属性及监听器

3.1.1 computed 计算属性

computed用于定义计算属性,计算属性是基于他们的依赖关系进行缓存的,只有当依赖的数据发生变化时,计算属性才会重新计算。

数据不发生变化:
<body>
    <div id="app">
        {{ msg }}
        <br>
        {{ reversedMsg }}
    </div>

    <script src="../js/vue3.js"></script>
    <script>
        Vue.createApp({
            data() {
                return {
                    msg: 'hello world!'
                }
            },
            computed: {
                reversedMsg() {
                    // split()用于将字符串分割成子字符串数组。
                    // reverse()用于反转数组元素的顺序。
                    //join()用于将数组元素合并成一个字符串。
                    return this.msg.split('').reverse().join('')
                }
            }
        }).mount('#app')
    </script>
</body>
数据发生变化:
<body>
    <div id="app">
        商品名称:小米手机<br>
        商品数量:<button @click="sub">-</button>{{ num }}<button @click="add">+</button><br>
        总价:{{ total }}
    </div>

    <script src="../js/vue3.js"></script>
    <script>
        Vue.createApp({
            data() {
                return {
                    num: 1
                }
            },
            computed: {
                total() {
                    return this.num * 5000
                }
            },
            methods: {
                sub() {
                    if (this.num > 1) this.num--
                    else this.num = 1
                },
                add() {

                    this.num++
                }
            }
        }).mount('#app')
    </script>
</body>
对数据进行再过滤处理:
<body>
    <div id="app">
        {{ newMoney }}
    </div>

    <script src="../js/vue3.js"></script>
    <script>
        Vue.createApp({
            data() {
                return {
                    money: 1000
                }
            },
            computed: {
                newMoney(){
                    return this.money + '¥'
                }
            }
        }).mount('#app')
    </script>
</body>

3.1.2 methods 方法

methods 是一个对象,用于定义组件的方法。这些方法可以在模板中调用,也可以在组件的其他部分(如生命周期钩子、计算属性等)中使用。

<body>
    <div id="app">
        {{ msg }}
        <br>
        {{ reversedMsg() }}
    </div>

    <script src="../js/vue3.js"></script>
    <script>
        Vue.createApp({
            data() {
                return {
                    msg: 'hello world!'
                }
            },
            methods: {
                reversedMsg() {
                    return this.msg.split('').reverse().join('')
                }
            }
        }).mount('#app')
    </script>
</body>
computedmethods 的区别:
  1. 缓存:computed有缓存,methods没有缓存。
  2. 调用方法:computed在模板中使用时不需要括号,methods需要括号。
  3. 适用场景:computed适用于依赖其他数据动态计算出的数据,methods适用于需要执行任何逻辑的场景。

3.1.3 watch 监听

watch 用于观察和响应数据的变化。当你需要在数据变化时执行一些操作,例如发送网络请求、更新其他数据等,可以使用 watch

3.1.3.1 watch 的基本用法

watch 是一个对象,键是需要观察的表达式,值是对应的回调函数。回调函数有两个参数:新值和旧值。

<body>
    <div id="app">
        商品名称:小米手机<br>
        商品数量:<button @click="sub">-</button>{{ num }}<button @click="add">+</button><br>
        总价:{{ total }}
    </div>

    <script src="../js/vue3.js"></script>
    <script>
        Vue.createApp({
            data() {
                return {
                    num: 1
                }
            },
            computed: {
                total() {
                    return this.num * 5000
                }
            },
            methods: {
                sub() {
                    this.num--
                },
                add() {

                    this.num++
                }
            },
            watch: {
                num(newVal, oldVal) {
                    this.num = newVal <= 0 ? oldVal : newVal
                }
            }
        }).mount('#app')
    </script>
</body>
深度监听:

当需要监听一个对象的属性变化,可以使用 deep 选项进行深度监听。这样,当监听的对象或数组内部发生变化时,回调函数也会被触发。

<body>
    <div id="app">
        商品名称:{{goods.name}}<br>
        商品数量:<button @click="sub">-</button>{{ goods.num }}<button @click="add">+</button><br>
        总价:{{ total }}
    </div>

    <script src="../js/vue3.js"></script>
    <script>
        Vue.createApp({
            data() {
                return {
                    goods: {
                        name: '小米手机',
                        num: 1
                    }
                }
            },
            computed: {
                total() {
                    return this.goods.num * 5000
                }
            },
            methods: {
                sub() {
                    this.goods.num--
                },
                add() {

                    this.goods.num++
                }
            },
            watch: {
                goods: {
                    handler(newVal, oldVal) {
                        console.log(newVal, oldVal)
                        this.goods.num = newVal.num
                    },
                    deep: true
                }
            }
        }).mount('#app')
    </script>
</body>

注意事项

  1. 性能影响:深度监听会对性能产生一定影响,因为它需要递归地遍历对象或数组的每个属性。因此,在不需要深度监听的情况下,尽量避免使用 deep: true
  2. 数组变化:深度监听可以监听到数组内部元素的变化,例如通过 pushpopsplice 等方法修改数组。

上述代码当数量小于1是时仍能继续减,解决方案:

<body>
    <div id="app">
        商品名称:{{goods.name}}<br>
        商品数量:<button @click="sub">-</button>{{ goods.num }}<button @click="add">+</button><br>
        总价:{{ total }}
    </div>

    <script src="../js/vue3.js"></script>
    <script>
        Vue.createApp({
            data() {
                return {
                    goods: {
                        name: '小米手机',
                        num: 1
                    }
                }
            },
            computed: {
                total() {
                    return this.goods.num * 5000
                },
                goodsStr() {
                    // JSON.stringify() 方法用于将一个 JavaScript 对象或值转换为一个 JSON 字符串。                     JSON 字符串是一种轻量级的数据交换格式。
                    return JSON.stringify(this.goods)
                }
            },
            methods: {
                sub() {
                    this.goods.num--
                },
                add() {

                    this.goods.num++
                }
            },
            watch: {
                goodsStr(newVal, oldVal) {
                    // JSON.parse() 方法用于将一个 JSON 字符串转换为一个 JavaScript 对象。
                    let newGoods = JSON.parse(newVal)
                    let oldGoods = JSON.parse(oldVal)
                    this.goods.num = newGoods.num <= 0 ? 1 :newGoods.num
                }
            }
        }).mount('#app')
    </script>
</body>

3.2 Vue的表单绑定

3.2.1 v-model 实现表单绑定

<body>
    <div id="app">
        <h3>注册</h3>
        <form>
            姓名:<input type="text" v-model="user.name"><br>
            密码:<input type="password" v-model="user.password"><br>
            确认密码:<input type="password" v-model="user.begin"><br>
            性别:<input type="radio" v-model="user.sex" value="0">男
                  <input type="radio" v-model="user.sex" value="1">女<br>
            爱好:<input type="checkbox" v-model="user.like" value="0">吃饭
                 <input type="checkbox" v-model="user.like" value="1">睡觉
                 <input type="checkbox" v-model="user.like" value="2">打豆豆<br>
            国籍:<select v-model="user.nationality">
                    <option value="0">中国</option>
                    <option value="1">美国</option>
                    <option value="2">英国</option>
                  </select><br>
            个人简介:<textarea cols="30" rows="10" v-model="user.brief"></textarea><br>
            <input type="button" @click="register" value="注册">
        </form>
    </div>

    <script src="../js/vue3.js"></script>
    <script>
        Vue.createApp({
            data() {
                return {
                    user: {
                        name: '',
                        password: '',
                        begin: '',
                        sex: 0,
                        like: [],
                        nationality: 0,
                        brief: ''
                    }
                }
            },
            methods: {
                register() {
                    console.log(this.user)
                }
            }
        }).mount('#app')
    </script>
</body>

3.2.2 v-model 修饰符

常见的修饰符:
  1. .lazy: 默认情况下,v-model 会在输入框的 input 事件中同步输入框的值。使用 .lazy 修饰符后,v-model 会在 change 事件中同步输入框的值,即输入框失去焦点后才更新数据。
  2. .trim: 使用 .trim 修饰符后,v-model 会自动去除输入框两端的空格。
  3. .number: 使用 .number 修饰符后,v-model 会将输入框的值转换为数值类型
<body>
    <div id="app">
        <!-- v-model.lazy 指令可以实现输入框失去焦点后才更新数据 -->
        {{ num }} <input type="text" v-model.lazy="num"><br>
        <!-- v-model.trim 指令可以自动去除输入框两端的空格 -->
        <input type="text" v-model.trim="msg"><button @click="submit">提交</button><br>
        <!-- v-model.number 指令可以将输入框的值转换为数值类型 -->
        {{ num + 1}} <input type="text" v-model.number="num">
    </div>

    <script src="../js/vue3.js"></script>
    <script>
        Vue.createApp({
            data() {
                return {
                    num: 10,
                    msg: 'hello'
                }
            },
            methods: {
                submit() {
                    console.log(this.msg)
                }
            }
        }).mount('#app')
    </script>
</body>

标签:学习,goods,return,methods,Vue,---,num,Vue3,computed
From: https://www.cnblogs.com/yishengwanwuzhao/p/18331172

相关文章

  • 扫描线学习笔记
    扫描线是一种算法思想,其特征为将静态\(k\)维问题转化为动态\(k-1\)维问题。动态\(k-1\)维问题往往需要数据结构维护。例题【模板】扫描线题意:求矩形面积并,其中每个举行的四边平行于坐标轴。考虑扫描线,将静态\(2\)维问题转化为动态\(1\)维问题。具体的,考虑按\(......
  • 牛客每日一题系列-001
    牛客23486小A与小B方法1:BFSfromcollectionsimportdequefromtypingimportListdefbfs(pos:tuple,direction:int)->List[List[int]]:ans=[[MAX]*Mfor_inrange(N)]vis=[[False]*Mfor_inrange(N)]queue=deque();queue.append((p......
  • JCR一区级 | Matlab实现SO-Transformer-LSTM多变量回归预测(蛇群算法优化)
    JCR一区级|Matlab实现SO-Transformer-LSTM多变量回归预测(蛇群算法优化)目录JCR一区级|Matlab实现SO-Transformer-LSTM多变量回归预测(蛇群算法优化)效果一览基本介绍程序设计参考资料效果一览基本介绍1.【JCR一区级】Matlab实现SO-Transformer-LSTM多变量......
  • 2024年华为OD机试真题-找出作弊的人-(C++/Java/python)-OD统一考试(C卷D卷)
    2024华为OD机试真题目录-(B卷C卷D卷)-【C++JavaPython】  题目描述公司组织了一次考试,现在考试结果出来了,想看一下有没人存在作弊行为,但是员工太多了,需要先对员工进行一次过滤,再进一步确定是否存在作弊行为。过滤的规则为:找到分差最小的员工ID对(p1,p2)列表,......
  • 【Java】韩顺平Java学习笔记 第19章 IO流
    文章目录文件概述常用的文件操作创建文件获取文件信息目录的操作和文件删除流的分类各抽象类常用子类对象FileInputStreamFileOutputStreamFileReaderFileWriter节点流和处理流概念BufferedReaderBufferedWriterBufferedInputStream&BufferedOutputStream对象流:Obje......
  • 解决ubuntu 22.04新内核6.5.0-15无法编译NVIDIA显卡驱动
    这里的新内核应该包括6.5.*系列的遇到的问题:在安装NVIDIA显卡驱动发现了一个问题,主要日志如下所示:make[3]:***[scripts/Makefile.build:251:/tmp/selfgz1310041/NVIDIA-Linux-x86_64-550.54.14/kernel/nvidia/nvlink_linux.o]Error1make[3]:Target'/tmp/selfgz131004......
  • Go-kratos框架商城微服务实战四
    Go-kratos框架商城微服务实战四接口测试,这里采用testify进行断言测试新建/test/目录新建/test/user_grpc_test.gopackagemainimport( "context" "log" "os" "testing" "time" v1"user/api/user/v1"//导入userclient &q......
  • De-ICE靶机
    getshell主机发现 arp-scan-l端口目录扫描,目录没有扫出来有利信息,查看端口,开放21,22端口,留意一下访问主页http://192.168.1.120/products.php?id=63 id处存在sql注入获取数据库下的账号密码sqlmap-uhttp://192.168.1.120/products.php?id=1-Dmysql--users......
  • HarmonyOS APP应用开发项目- MCA助手(Day03持续更新中~)
    简言:gitee地址:https://gitee.com/whltaoin_admin/money-controller-app.git端云一体化开发在线文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/agc-harmonyos-clouddev-view-0000001700053733-V5注:此App参照此教程进行二次修改:https://www.bilibi......
  • Django-APP及项目入门
    1.APP定义:Django中功能的细分,每个APP有独立的数据库、表结构、HTML模版、CSS。创建APPpythonmanage.pystartappapp01重要文件介绍views.py:常用文件,urls中的函数常常在此处定义。models.py:常用文件,对数据库进行操作。2.项目入门确保app也注册(settings.py)......