• vue中使用iview表单验证时this指针问题


    需求


    使用iview,在提交时对值b进行验证,使其不能大于值a

    实现

        <Form
          ref="config"
          :model="config"
          :rules="configRules"
          label-position="right"
          inline
        >
          <FormItem prop="a" label="值a:" :label-width="86">
            <i-input v-model="config.a"></i-input>
          </FormItem>
          <FormItem prop="b" label="值b:" :label-width="100">
              <i-input v-model="config.b"></i-input>
          </FormItem>
          <FormItem :label-width="20">
            <Button type="primary" @click="putConfig">提交</Button>
          </FormItem>
        </Form>
    
    export default {
      name: "Config",
      data() {
        return {
          config: {
            a: undefined,
            b: undefined
          },
          configRules: {
            b: [
              {
                trigger: "blur",
                validator(rule, value, callback) {
                  console.log(this);
                  if (Number(value) > Number(this.config.a)) {
                    return callback(new Error("值b不能超过值a"));
                  }
                  return callback();
                }
              }
            ]
          }
        };
      },
    }
    

    问题以及原因

    此时,validator验证函数中this.config.a根本取不到值。
    通过打印this,发现此时this没有指向vue实例,
    而是指向调用validator函数的对象,iview这里会用一个验证相关的对象,长这样

    而这个对象中并没有config.a。
    这里根本原因是普通函数中的this会指向调用时的函数作用域上,这里validator函数是被这个验证对象调用的,所以this指向了它

    解决办法

    将validator使用箭头函数的形式:

                validator: (rule, value, callback) => {
                  console.log(this);
                  if (Number(value) > Number(this.config.a)) {
                    return callback(new Error("值b不能超过值a"));
                  }
                  return callback();
                }
    

    箭头函数本身是没有this的,它的this是包含箭头函数的第一个普通函数中的this;
    如果箭头函数没有被普通函数包含,那么它的this会指向到定义时的作用域上;
    这里指向了当前vue实例,从而能够正确获取this.config.a

    总结

    这里通过阅读资料总结了一下关于this指向的情况:

    • 箭头函数本身是没有this的,它的this是包含箭头函数的第一个普通函数中的this;
    • 如果箭头函数没有被普通函数包含,那么它的this会指向到定义时的作用域上;
    • 而普通函数中的this会指向调用时的函数作用域上;

    ps: 由于对指针理解的并不是很透彻,可能有总结不对的地方,欢迎指正~

  • 相关阅读:
    JDK10源码阅读--String
    [java大数据面试] 2018年4月百度面试经过+三面算法题:给定一个数组,求和为定值的所有组合.
    python scrapy爬取知乎问题和收藏夹下所有答案的内容和图片
    读取数据库信息并生成表设计文档Word版本
    怀念那时正规的软件开发流程
    eclipse安装java web插件
    webAPI+angularJS文件上传和下载
    .net整理
    怎么向老板解释你工作的价值?
    JS高级代码
  • 原文地址:https://www.cnblogs.com/XHappyness/p/11752147.html
Copyright © 2020-2023  润新知