首页 > 其他分享 >Vue基础–Options API

Vue基础–Options API

时间:2024-10-29 15:59:32浏览次数:7  
标签:info Vue app watch newValue API oldValue message Options

复杂data的处理方式

◼ 我们知道,在模板中可以直接通过插值语法显示一些data中的数据。
◼ 但是在某些情况,我们可能需要对数据进行一些转化后再显示,或者需要将多个数据结合起来进行显示;
    比如我们需要对多个data数据进行运算、三元运算符来决定结果、数据进行某种转化后显示;
    在模板中使用表达式,可以非常方便的实现,但是设计它们的初衷是用于简单的运算;
    在模板中放入太多的逻辑会让模板过重和难以维护;
    并且如果多个地方都使用到,那么会有大量重复的代码;

例如:

    div id="app">
    <!-- 拼接名字 -->
    <!-- 方式一:使用插值语法表达式直接拼接-->
     <h2>姓名:{{firstName +" "+lastName}}</h2>
     <h2>{{firstName}}{{lastName}}</h2>
    <!-- 2.显示分数等级 -->
     <h2>{{score >=60?"及格":"不及格"}}</h2>
     <!--3.反转单词显示文本 -->
     <h2>{{message.split(" ").reverse().join()}}</h2>
    </div>
    <!-- 引入本地vue文件 -->
    <script src="./lib/vue.js"></script>
    <script>
      // 创建app
      const app = Vue.createApp({
        data(){
          return{
            // message:"Hello Vue"
            //1.姓名
            firstName:"Kobe",
            lastName:"bryant",
            // 2.分数:根据分数显示及格/不及格
            score:80,
            // 2.一串文本:对文本中的单词进行反转显示
            message:"my name is hdc"
          }
        },

      })
      // 挂载app
      app.mount("#app")
    ```
    ◼ 我们有没有什么方法可以将逻辑抽离出去呢?
        可以,其中一种方式就是将逻辑抽取到一个method中,放到methods的options中;
    例如:
      <div id="app">
    <!-- 拼接名字 -->
    <!-- 方式一:使用methods函数调用拼接-->
     <h2>姓名:{{getFullName()}}</h2>
     <h2>{{getFullName()}}</h2>
    <!-- 2.显示分数等级 -->
     <h2>{{scoreLevel()}}</h2>
     <!--3.反转单词显示文本 -->
     <h2>{{formartArr()}}</h2>
  </div>
  <!-- 引入本地vue文件 -->
  <script src="./lib/vue.js"></script>
  <script>
    // 创建app
    const app = Vue.createApp({
      data(){
        return{
          // message:"Hello Vue"
          //1.姓名
          firstName:"Kobe",
          lastName:"bryant",
          // 2.分数:根据分数显示及格/不及格
          score:80,
          // 2.一串文本:对文本中的单词进行反转显示
          message:"my name is hdc"
        }
      },
      methods:{
        getFullName(){
          return this.firstName +" "+this.lastName
        },
        scoreLevel(){
          if(this.score >=60){return "及格"}
          return "不及格"
        },
        formartArr(){
          return this.message.split(" ").reverse().join(" ")
        }
      }

    })
    // 挂载app
    app.mount("#app")
    但是,这种做法有一个直观的弊端,就是所有的data使用过程都会变成了一个方法的调用;
    另外一种方式就是使用计算属性computed;

认识计算属性computed

    <div id="app">
    <!-- 拼接名字 -->
    <!-- 方式一:使用methods函数调用拼接-->
     <h2>姓名:{{fullName}}</h2>
     <h2>{{fullName}}</h2>
    <!-- 2.显示分数等级 -->
     <h2>{{scoreLevel}}</h2>
     <!--3.反转单词显示文本 -->
     <h2>{{formatArr}}</h2>
  </div>
  <!-- 引入本地vue文件 -->
  <script src="./lib/vue.js"></script>
  <script>
    // 创建app
    const app = Vue.createApp({
      data(){
        return{
          // message:"Hello Vue"
          //1.姓名
          firstName:"Kobe",
          lastName:"bryant",
          // 2.分数:根据分数显示及格/不及格
          score:80,
          // 2.一串文本:对文本中的单词进行反转显示
          message:"my name is hdc"
        }
      },
      methods:{
      },
      computed:{
        // 计算属性默认对应的是一个函数
        fullName(){return this.firstName + " " + this.lastName},
        scoreLevel(){return this.score >= 60?"及格":"不及格"}, 
        formatArr(){return this.message.split(" ").reverse().join(" ")},
      }

    })
    // 挂载app
    app.mount("#app")

计算属性vsmethods


计算属性的缓存

计算属性的setter和getter

认识侦听器watch

    <div id="app">
    <h2>{{message}}</h2>
    <button @click="changeMessage">修改message</button>
  </div>
  <!-- 引入本地vue文件 -->
  <script src="./lib/vue.js"></script>
  <script>
    // 创建app
    const app = Vue.createApp({
      data(){
        return{
          message:"Hello Vue",
          info:{name:"hdc",age:21,height:1.88}
        }
      },
      methods:{
        changeMessage(){
          this.message = "你好啊!WEBKing",
          this.info={name:"kobe",age:30,height:1.98}
        }
      },
      watch:{
        // 可以传递两个参数:newValue/oldValue
        message(newValue,oldValue){
          console.log("message发生变化",newValue,oldValue)
        },
        // 对象类型拿到的都是proxy代理对象
        info(newValue,oldValue){
          console.log("info发生变化",newValue,oldValue)
          // 获取原始对象
          //方式一:展开运算符
          console.log({...newValue},{...oldValue})
          //Vue方法:toRaw()
          console.log(Vue.toRaw(newValue),Vue.toRaw(oldValue))
        }
      }
    })
    // 挂载app
    app.mount("#app")

侦听器watch的配置选项

◼ 我们先来看一个例子:
  <div id="app">
    <h2>{{info.name}}</h2>
    <button @click="changeInfo">更改info</button>
  </div>
  <!-- 引入本地vue文件 -->
  <script src="./lib/vue.js"></script>
  <script>
    // 创建app
    const app = Vue.createApp({
      data(){
        return{
          info:{name:"hdc",age:21}
        }
      },
      methods:{
        changeInfo(){
          // 创建一个新对象赋值给info
          // this.info = {name:"kobe"}
          // 2,直接修改原对象某一个属性
          this.info.name = "kobe"
        }
      },
      watch:{
        info(newValue,oldValue){
          console.log("侦听到info发生改变",newValue,oldValue)
        }
      }
    })
    // 挂载app
    app.mount("#app")
    当我们点击按钮的时候会修改info.name的值;
    这个时候我们使用watch来侦听info,可以侦听到吗?答案是不可以。
◼ 这是因为默认情况下,watch只是在侦听info的引用变化,对于内部属性的变化是不会做出响应的:
    但是template模板里面的内容是深度监听的;
    这个时候我们可以使用一个选项deep进行更深层的侦听;
    注意前面我们说过watch里面侦听的属性对应的也可以是一个Object;
◼ 还有另外一个属性,是希望一开始的就会立即执行一次:
    这个时候我们使用immediate选项;
    这个时候无论后面数据是否有变化,侦听的函数都会有限执行一次;
      watch:{
        // 默认watch监听不会进行深度监听的
        // info(newValue,oldValue){
        //   console.log("侦听到info发生改变",newValue,oldValue)
        // }
        // 进行深度监听
        info:{
          handler(newValue,oldValue){
            console.log("侦听到info发生改变",newValue,oldValue)
            // 没有改变info只是改变了info里的属性,所以他们两个是相等的
            console.log(newValue === oldValue)//true
          },
          // 深度监听
          deep:true,
          // 第一次渲染的时候就执行监听器
          immediate:true
          
        }
      }

侦听器watch的配置选项(代码)

侦听器watch的其他方式(一)

侦听器watch的其他方式(二)

◼ 另外一个是Vue3文档中没有提到的,但是Vue2文档中有提到的是侦听对象的属性:
```
  'info.name':function(newValue,oldValue){
      console.log(newValue,oldValue);
    }
```
◼ 还有另外一种方式就是使用$watch 的API:
◼ 我们可以在created的生命周期(后续会讲到)中,使用this.$watch 来侦听;
    第一个参数是要侦听的源;
    第二个参数是侦听的回调函数callback;
    第三个参数是额外的其他选项,比如deep、immediate;
```
  // 生命周期回调函数:当前的组件被创建时自动执行
  //一般在该函数中会进行网络请求
  created(){
    // this.message = []
    this.$watch("message",(newValue,oldValue)=>{
       console.log(newValue,oldValue)
    },{deep:true,immediate:true})
  }
})
```

标签:info,Vue,app,watch,newValue,API,oldValue,message,Options
From: https://www.cnblogs.com/hdc-web/p/18513660

相关文章

  • [Azure] 使用 Cosmos DB for NoSQL 的 API
    什么是AzureCosmosDBforNoSQL?AzureCosmosDBforNoSQL是用于处理文档数据模型的原生非关系服务。它可以使用灵活的架构任意存储原生JSON文档。数据会自动编制索引,并可使用专为JSON数据设计的SQL查询语言进行查询。使用适用于常用框架(如.NET、Python、Java和Node......
  • axios请求封装(vue2)
    importaxiosfrom'axios';import{ElLoading,ElMessage}from'element-plus';import{RefreshToken}from'@/request';import{getlocalStorage,setlocalStorage}from'@/utils/common.js';constpendingMap=new......
  • vue——抽取请求配置文件,打包后修改配置文件可修改请求地址,不用二次打包。问题:本地启
    参考:1.https://blog.csdn.net/u012193330/article/details/83310924  webpack中的path、publicPath、contentBase的区分2.https://www.cnblogs.com/beichengshiqiao/p/17339341.html vue全家桶进阶之路48:Vue3跨域配置devServer的参数和设置3.https://www.cnblogs.com/jing......
  • 购物平台数据抓取实战指南:从API到深度分析
    在当今电商盛行的时代,淘宝、京东、拼多多等购物平台已成为消费者日常购物的主要场所。对于企业、市场分析师及开发者而言,这些平台上的数据无疑是一座宝贵的金矿。本实战指南将带您从API接口出发,一步步实现购物平台数据的抓取、处理到深度分析。一、API接口初探API(Application......
  • 如何获得淘宝/天猫淘宝商品详情 API接口
    要获得淘宝商品详情API接口,通常可以通过以下几种途径:一、淘宝开放平台:注册账号:开发者需要在淘宝开放平台上注册账号,成为开发者。创建应用:在注册完成后,创建一个应用并提交审核。审核通过后,平台会为应用分配相应的API密钥(AppKey和AppSecret)。获取接口:使用分配的API密......
  • API 接口:电商行业高效运作的关键驱动
    在电商行业中,API(ApplicationProgrammingInterface,应用程序编程接口)接口正逐渐成为高效运作的关键驱动因素。它就像是电商生态系统中的“桥梁”和“纽带”,连接着不同的软件系统、服务和数据源,为电商企业提供了强大的功能扩展和集成能力。一、API接口在电商行业中的重要......
  • Vue基础-列表渲染v-for
    列表渲染v-for基本使用◼v-for的基本格式是"itemin数组":数组通常是来自data或者prop,也可以是其他方式;item是我们给每项元素起的一个别名,这个别名可以自定来定义;◼我们知道,在遍历一个数组的时候会经常需要拿到数组的索引:如果我们需要索引,可以使用格式:"item......
  • springboot vue前后端分离:网上茶叶商城网站设计与实现作品截图和开题报告
      博主介绍:黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育、辅导。所有项目都配有从入门到精通的基础知识视频课程,学习后应对毕业设计答辩,提供核心代码讲解,答辩指导。项目配有对应开......
  • Springboot+vue的公司日常考勤管理系统(有报告),Javaee项目,springboot vue前后端分离项目
    演示视频:Springboot+vue的公司日常考勤管理系统(有报告),Javaee项目,springbootvue前后端分离项目。项目介绍:本文设计了一个基于Springboot+vue的前后端分离的公司日常考勤管理系统,采用M(model)V(view)C(controller)三层体系结构,通过Spring+SpringBoot+Mybatis+Vue+Maven......
  • ssm+vue的班级事务管理系统(有报告)。Javaee项目,ssm vue前后端分离项目。
    演示视频:ssm+vue的班级事务管理系统(有报告)。Javaee项目,ssmvue前后端分离项目。项目介绍:采用M(model)V(view)C(controller)三层体系结构,通过Spring+SpringMvc+Mybatis+Vue+Maven来实现。MySQL数据库作为系统数据储存平台,实现了基于B/S结构的Web系统。界面简洁,操作简单......