你知道this.$options吗?(Vue)

2023-11-11

题记

我们在Vue项目中会有很多情况下需要用到this.$options,所以接下来我们介绍几个场景会用到$options,我们想第一个问题当我们在template经常使用filter,那么你可以直接在methods里边用过滤器吗?我们在表单输入一般可不可以直接清空啊回到起点,我们在一个别人已经写的代码的复杂组件中,他们的功能在最后没有重置数据的初始值那么我们自己新加的功能需要用数据怎么初始值呢?。。。

一、过滤器不能通过this来复用?不存在的

过滤器被用于一些常见的文本格式化,被添加在表达式的尾部,由“管道”符号指示。

<div>{{ text | caplize }}</div>

export default {
    data() {
        return {
            text: 'hello'
        }  
    },
    filters: {
        caplize: function (value) {
            if (!value) return ''
            value = value.toString()
            return value.charAt(0).toUpperCase() + value.slice(1)
         }
    }
}

大胆试想一个场景,不仅模板内用到这个函数,在 method 里也需要同样功能的函数。但过滤器无法通过 this 直接引用,难道要在 methods 再定义一个同样的函数吗?

要知道,选项配置都会被存储在实例的 $options 中,所以只需要获取 this.$options.filters就可以拿到实例中的过滤器。

export default {
    methods: {
        getDetail() {
            this.$api.getDetail({
                id: this.id
            }).then(res => {
                let capitalize = this.$options.filters.caplize
                this.title = caplize(res.data.title)
            })
        }
    }
}

 除了能获取到实例的过滤器外,还能获取到全局的过滤器,因为 this.$options.filters 会顺着 proto 向上查找,全局过滤器就存在原型中。

二、重置data中的数据? 不想改变别人的代码拿到初始化的数据

在vue单文件组件里有时需要重置data中的数据,比如表单填写一半,用户想重新填写。

<script>
    export default {
        data() {
            return {
                // 表单
                form: {
                    input: ''
                }
            }
        },
        methods: {
            // 重置表单方法
            retset() {
                this.form = this.$options.data().form;
            }
        },
    }
</script>

也可以通过给组件$data对象赋值来重置来重置整个$data。 

this.$data = this.$options.data();

通过下边的方法可以可以拿到我们初始化的query数据

 this.query = this.$options.data().query
      if (this.val.length > 0) {
        if (val.length > 1) {
          this.$message('只能选择一条')
          return
        }
        let amout = 0
        this.val.forEach(item => {
          amout = amout + item.billAmount
        })
        this.query.sumAmount = amout
      } else {
        this.query.billAmount = this.val[0].billAmount
      }

 二、通过一些不需要响应式的数据我们不加响应式,提高Vue的性能可以吗?

当然如果你问到这个问题,绝对是非常用心的,我们的变量有的时候确实不需要变化的,这样的变量我们可以放在data()之外,这样的变量就是没有响应式的,因为定义data中的数据会被自动添加了get和set方法,有时会有性能的浪费。

 <span> {{$options.big}}</span>
    <el-button @click="changeName">改变big变量</el-button>
<script>
export default {
  big: "冬雨",
  data() {
    return {
         
    };
  },
  methods:{
    changeName(){
        console.log(this.$options.big);
        this.$options.big="周冬雨";
      },
  }
  //在data外面定义的属性和方法通过$options可以获取和调用

</script>

 我们发现:
点击按钮之后,bigName的值会变,但是界面显示还是之前的。因为没有对bigName绑定set、get方法。

延申

你知道this.$data与this.$options.data()两者的区别吗?前者是一直变化的值,而后者是初始化的值,那么我们知道我们重置的时候就会产生新的思路大家看下下边的代码

methods:{
        gotos(){
            this.obj.sex='我改变了'
        },
        //获取vue中data中的所有值 当然data中的值也有可能是被改变了的
        obtain(){
            console.log('vue中data中的所有值',this.$data);
        },
        // 获取组件下初始状态下的值;就是你在data中最初写的值
        inithander(){
            console.log('初始状态下的值',this.$options.data());
        },
        // 重置值
        reset(){
            Object.assign(this.$data.obj,{name:'',age:'', sex:''});
            // 还可以使用   Object.assign(this.$data.obj,this.$options.data().obj); //前提是obj的值是空
            console.log('重置', this.obj )
        }
    }

路过的都是有缘人,你一定是喜欢学习热爱学习的有志青年,点个赞吧,谢谢!!!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

你知道this.$options吗?(Vue) 的相关文章

  • 在 config() 模块中注入依赖项 - AngularJS

    目前在 app js 中我有以下路线 var gm angular module gm gm services gm directives gm filters gm controllers ngSanitize gm config rou
  • Vue.js + Element UI:在更改时获取“event.target”

    我无法获取在事件处理程序中触发事件的 html 字段 在 javascript 中是event target 我有一个表格 附加到更改事件函数的输入元素 管理更改事件的函数 我的代码如下 var Main methods change pa
  • 将相同的多个对象推送到多个数组中

    这是后续使3个数组相互对应 第一个是对象名称 https stackoverflow com questions 57564488 make 3 arrays correspond to each other with the first
  • Chart.js 渲染垂直堆积条形图太慢

    我正在使用 Chart js API 渲染多个堆叠的垂直条形图 但性能很慢 我什至做了一些改变 这样所有的content对象已经由服务器而不是浏览器处理 但我意识到大部分时间来自最终函数new Chart overallStatsChart
  • 计算div中有多少个元素

    我有一个div 里面有span 有没有一种方法可以计算 div 中有多少个元素 然后将其作为值给出 例如 一个 div 中有 5 个跨度 那么它会对其进行计数并发出警报 5 请使用 JavaScript 谢谢 如果你想要后代的数量 你可以使
  • 使用 lambda 更新 amazon s3 对象元数据而不执行对象复制?

    是否可以使用 lambda 函数添 加或更新 s3 对象元数据而不复制对象 这篇 2 年前的帖子说我们确实需要复制一份 https stackoverflow com questions 32646646 how do i update m
  • 如何使用 javascript/ASP.NET/CSS 旋转和淡入淡出背景图像

    我需要随机淡入淡出背景图像 这将是一个定时函数 例如每 5 秒一次 我需要使用 ASP NET Javascript CSS 或全部三者来完成此操作 请大家帮帮我 谢谢 Cycle 一个 jQuery 插件 是一个非常灵活的图像旋转解决方案
  • 如何在 Ionic 2 中动态创建具有特定类的模式?

    嗨 我已经被一个问题困扰好几天了 到目前为止还没有研究证明足够 我正在尝试在 Ionic 2 中创建一个具有特定类 或 id 的简单模式 我需要这样简单的东西
  • 在 angularJS 中覆盖模块值/常量的最佳方法

    我用 angularJS 编写了一个模块 封装了所有后端通信 为了获得更大的灵活性 我将 api 前缀作为模块上的常量值 可能是值 因为我没有在配置阶段使用它 所以像 angular module myapp data constant a
  • 如何验证单选按钮?

    我的 Rails 应用程序中有一个单选按钮 我想编写一个 java 脚本代码 在未选择任何选项时验证这一点 在你的 votes 类中做类似的事情 class Myvotes lt ActiveRecord Base validates vo
  • 如何为多个元素添加Class?

    我正在使用这段 javascript 向多个元素添加一个类 我试图引用多个 div 并向它们添加类 它只适用于第一个 JavaScript
  • 节省页面加载时间的提示[重复]

    这个问题在这里已经有答案了 我的问题 削减那些不必要的 kb 并使页面加载速度更快的最佳方法是什么 全部是什么优化实践 编码实践 在js php中 如果执行可以使您的页面更轻 为什么我问这个 我读了这篇关于 jquery js 与 jque
  • ES6 Promises/在满足多个 Promise 后调用函数(不能使用 Promises.all)[重复]

    这个问题在这里已经有答案了 我正在编写 Javascript 它需要这些事件按以下顺序发生 同时触发多个 API 调用 所有调用完成且响应返回后 执行一行代码 听起来很简单 但棘手的部分是我不能使用 Promises all 因为我仍然希望
  • Immutable.js 推入嵌套对象中的数组

    假设有一个对象 const object foo bar 1 2 3 我需要推动4 to object foo bar array 现在我正在这样做 const initialState Immutable fromJS object co
  • 如何在 Vue.js 2 中使用事件总线通过自定义事件传递数据

    我在用着Vue js 2 5 x 在我的玩具项目中 我实现了一个事件总线 类似于所示的here https alligator io vuejs global event bus 事件总线在 Vue 原型中全局注册为 eventBus 然后
  • javascript捕获文本区域中的粘贴事件

    我目前有一个文本区域 我需要控制已粘贴的文本 本质上 我需要能够将用户想要粘贴到文本区域中的任何内容并将其放入变量中 然后我将计算出他们粘贴文本的位置和字符串的大小 以将其从文本区域中删除 然后最后用我自己的方式处理变量中的文本 我的问题
  • 检测未定义的对象属性

    如何检查 JavaScript 中的对象属性是否未定义 检查属性值是否为特殊值的常用方法undefined is if o myProperty undefined alert myProperty value is the special
  • 如何找出javascript中加载了哪些javascript?

    继另一个问题的评论之后 我问自己是否有办法获取页面上加载的所有 js 代码的列表 就像 Firebug 或 chrome Inspector 所做的那样 有没有一种纯javascript的方法 一种方法是抓取脚本标签 但这样你可能会错过动态
  • 对于调用另一个异步函数的异步函数,玩笑测试失败

    我正在尝试测试一个使用另一个异步函数返回的数据的异步函数 这是解释我的问题的代码 StudentInfo js export async function getData studentData imported from another
  • Page_ClientValidate 正在验证多次。

    我的问题是 验证摘要消息 警报 显示两次 我无法弄清楚原因 请帮忙 这是代码 function validate javascript function if typeof Page ClientValidate function var

随机推荐

  • Angular 下的 function

    angular lowercas 将指定的字符串转换为小写的 Usage 使用方法 angular lowercase string Arguments Param Type Details string string 字符串转换成小写 R
  • c语言二叉树链式存储,二叉树链式存储基本操作(C语言)

    1 二叉链的定义 LinkBinTree h文件 二叉树结点结构 typedef struct binnode int data struct binnode lchild struct binnode rchild BinNode 二叉树
  • Host is not allowed to connect to this MySQL server解决方法

    这个错误 其实就是我们安装的MySQL不允许远程登录 解决方法如下 1 在装有MySQL的机器上登录MySQL mysql u root p密码 执行use mysql select host from user where user ro
  • mongodb的MapReduce幂等性

    习惯用MapReduce来做mongodb的聚合 这一次遇到一点小问题 原数据如下 使用一个简单的MapReduce来验证一下数据 map function emit clientKey this clientKey dtime this
  • IDEA中SpringBoot启动错误无法加载主类

    1 项目里面 idea文件 删除 重启idea mvn claean install
  • MiniGUI 自定义控件教程7

    接着上次的教程继续 这次给大家介绍的是界面美观的进度条控件 它功能上和MiniGUI原有的进度条控件 CTRL PROGRESSBAR 是一样的 其实进度条也就是那些功能 哪还能整出别点什么花样哦 一 功能确定 1 要具有MiniGUI原有
  • ORACLE等待事件类型【Classes of Wait Events】

    每一个等待事件都属于某一类 下面给出了每一类等待事件的描述 Every wait event belongs to a class of wait event The following list describes each of the
  • 深入理解字节对齐

    C语言 字节对齐 基础知识了解 一 操作系统位数 CPU位数 指令集 1 操作系统 32 bit x86 和64 bit x64 1 位数 2 64 bit 2 处理器CPU位数 3 CPU指令集 4 寄存器 5 关系 6 计算机字长 机器
  • 百度智能云X英伟达直播实录超级AI计算机X-MAN技术

    GPU进入数据中心约有8 10年 这些年内 GPU显存的容量 GPU P2P带宽 GPU性能都在不断提升 据不完全统计 每年GPU显存大约有一倍的变化 P2P带宽有1 5倍到2倍的变化 而且性能变化更多 由于性能的变化 会引起GPU功耗的变
  • Android中解决第三方库重复引用的问题

    如果app中引入了一个新的第三方库 并且这个新库中引入了原本已经引入的另一个库 结果导致重复引用 编译就会报错 如何解决呢 方法是使用exclude排除重复的库 举例 假设新引入的第三方库是 com xiboliya mylib netto
  • JAVA中的类

    一 什么是类 概念 类就是某些具备某些共同特征的实体的集合 它是一种抽象的数据类型 它是对所具有相同特征实体的抽象 在面向对象的程序设计语言中 类是对一类 事物 的属性与行为的抽象 类可以理解为一个模板 它描述一类对象的行为和状态 举个例子
  • 【Linux安全】chattr命令锁定账户敏感文件

    有时候你发现用root权限都不能修改某个文件 大部分原因是曾经用chattr命令锁定该文件了 chattr命令的作用很大 其中一些功能是由Linux内核版本来支持的 不过现在生产绝大部分跑的linux系统都是2 6以上内核了 通过chatt
  • jQuery 入门教程(9):终止动画

    jQuery的使用stop 方法在动画结束之前停止动画 基本语法如下 selector stop stopAll goToEnd 可选参数stopAll 指明是否同时清除 动画队列 缺省为false 意味着只停止当前活动的动画 之后的动画则
  • retrofit合理的处理response

    OKHttp retrofit 有时候使用起来确实会受到一些局限 比如 处理response的加解密 处理response的返回的字段与本地封装的不一样 又不能改本地的字段 所以需要对返回的JSON进一步处理 别名的方式 处理respons
  • 【mysql】云服务器被攻击,数据库以及数据都被删除如何通过binlog日志恢复

    前言 小编买了一台阿里云服务器 然后通过docker 部署了mysql 然后用了一段时间突然发现数据都没有了 然后就排查问题 发现是被攻击了 如下图 you must pay 0 26BTC 怒了 好多钱呢 如果有同样的问题 可以参考此博客
  • MFC实现socket网络通信--主机与服务器之间传送数据

    MFC实现socket网络通信 模拟主机与服务器之间传送数据 MFC实现socket网络通信 1 新建MFC应用程序 2 创建服务端窗口界面 3 写服务器代码 4 创建客户端窗口界面 5 客户端代码部分 6 开始调试 7 小结 MFC实现s
  • smallworld bm 配为ldap授权后授权界面中无法显示设计权限,需要修改config_local_and_ldap.xml配置文件

    config local and ldap xml配置文件增加相应配置
  • Sequel Pro导出关系图,可视化你的数据库

    教程链接 https nicolaswidart com blog exporting relations diagram from sequel pro 简易步骤 使用homebrew安装 brew install graphviz Se
  • 【网络通信】Netty面试专题之十大考问

    1 BIO NIO 和 AIO 的区别 BIO 一个连接一个线程 客户端有连接请求时服务器端就需要启动一个线程进行处理 线程开销大 伪异步 IO 将请求连接放入线程池 一对多 但线程还是很宝贵的资源 NIO 一个请求一个线程 但客户端发送的
  • 你知道this.$options吗?(Vue)

    题记 我们在Vue项目中会有很多情况下需要用到this options 所以接下来我们介绍几个场景会用到 options 我们想第一个问题当我们在template经常使用filter 那么你可以直接在methods里边用过滤器吗 我们在表单