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


    题记

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

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

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

    {{ text | caplize }}

    1. export default {
    2. data() {
    3. return {
    4. text: 'hello'
    5. }
    6. },
    7. filters: {
    8. caplize: function (value) {
    9. if (!value) return ''
    10. value = value.toString()
    11. return value.charAt(0).toUpperCase() + value.slice(1)
    12. }
    13. }
    14. }

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

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

    1. export default {
    2. methods: {
    3. getDetail() {
    4. this.$api.getDetail({
    5. id: this.id
    6. }).then(res => {
    7. let capitalize = this.$options.filters.caplize
    8. this.title = caplize(res.data.title)
    9. })
    10. }
    11. }
    12. }

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

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

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

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

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

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

    1. this.query = this.$options.data().query
    2. if (this.val.length > 0) {
    3. if (val.length > 1) {
    4. this.$message('只能选择一条')
    5. return
    6. }
    7. let amout = 0
    8. this.val.forEach(item => {
    9. amout = amout + item.billAmount
    10. })
    11. this.query.sumAmount = amout
    12. } else {
    13. this.query.billAmount = this.val[0].billAmount
    14. }

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

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

    1. {{$options.big}}
    2. <el-button @click="changeName">改变big变量el-button>
    3. <script>
    4. export default {
    5. big: "冬雨",
    6. data() {
    7. return {
    8. };
    9. },
    10. methods:{
    11. changeName(){
    12. console.log(this.$options.big);
    13. this.$options.big="周冬雨";
    14. },
    15. }
    16. //在data外面定义的属性和方法通过$options可以获取和调用
    17. script>

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

    延申

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

    1. methods:{
    2. gotos(){
    3. this.obj.sex='我改变了'
    4. },
    5. //获取vue中data中的所有值 当然data中的值也有可能是被改变了的
    6. obtain(){
    7. console.log('vue中data中的所有值',this.$data);
    8. },
    9. // 获取组件下初始状态下的值;就是你在data中最初写的值
    10. inithander(){
    11. console.log('初始状态下的值',this.$options.data());
    12. },
    13. // 重置值
    14. reset(){
    15. Object.assign(this.$data.obj,{name:'',age:'', sex:''});
    16. // 还可以使用 Object.assign(this.$data.obj,this.$options.data().obj); //前提是obj的值是空
    17. console.log('重置', this.obj )
    18. }
    19. }

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

  • 相关阅读:
    JAVA毕业设计客服管理系统计算机源码+lw文档+系统+调试部署+数据库
    C++学习day--24 推箱子游戏图像化开发
    【NestJS系列】连接数据库及优雅地处理响应
    ROS2——ROS2对比ROS1(二)
    LabVIEW编程开发NI-USRP
    Golang学习日志 ━━ 部署Gin-Vue-Admin到windows系统并启用IIS服务,顺便学习如何设置IIS反向代理
    C#开发的OpenRA游戏之延时初始化Lazy<T> 类
    Windows系统SVN SERVER迁移。从服务器A迁移到服务器B
    Linux开机启动流程/socket/软中断和硬中断
    架构师系列-消息中间件(九)- RocketMQ 进阶(三)-消费端消息保障
  • 原文地址:https://blog.csdn.net/2201_75705263/article/details/132714630