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

题记

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

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

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

javascript 复制代码
<div>{{ text | caplize }}</div>
javascript 复制代码
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就可以拿到实例中的过滤器。

javascript 复制代码
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中的数据,比如表单填写一半,用户想重新填写。

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

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

复制代码
this.$data = this.$options.data();

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

javascript 复制代码
 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方法,有时会有性能的浪费。

javascript 复制代码
 <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()两者的区别吗?前者是一直变化的值,而后者是初始化的值,那么我们知道我们重置的时候就会产生新的思路大家看下下边的代码

javascript 复制代码
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 )
        }
    }

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

相关推荐
HashTang2 小时前
【AI 编程实战】第 12 篇:从 0 到 1 的回顾 - 项目总结与 AI 协作心得
前端·uni-app·ai编程
狂炫冰美式2 小时前
把手从键盘上抬起来:AI 编程的 3 个不可逆阶段
前端·后端·ai编程
codingWhat2 小时前
uniapp 多地区、多平台、多环境打包方案
前端·架构·node.js
H0482 小时前
symbol为什么说是为了解决全局变量冲突的问题
javascript
HelloReader2 小时前
从 Tauri 2.0 Beta 升级到 2.0 Release Candidate Capabilities 权限前缀与内置 Dev Server 网络策略变
前端
只与明月听3 小时前
RAG深入学习之Chunk
前端·人工智能·python
一枚前端小姐姐3 小时前
低代码平台表单设计系统架构分析(实战一)
前端·低代码·架构
HelloReader3 小时前
Tauri 1.0 升级到 Tauri 2.0从“能跑”到“跑得稳”的迁移实战指南(含移动端准备、配置重构、插件化 API、权限系统)
前端
Always_Passion3 小时前
FE视角下的Referrer全面解析
javascript·面试
apollo_qwe4 小时前
深入解析Vue的mixins与hooks:复用逻辑的两种核心方式
vue.js