zoukankan      html  css  js  c++  java
  • 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: 由于对指针理解的并不是很透彻,可能有总结不对的地方,欢迎指正~

  • 相关阅读:
    【纯水题】POJ 1852 Ants
    【树形DP】BZOJ 1131 Sta
    【不知道怎么分类】HDU
    【树形DP】CF 1293E Xenon's Attack on the Gangs
    【贪心算法】CF Emergency Evacuation
    【思维】UVA 11300 Spreading the Wealth
    【树形DP】NOI2003 逃学的小孩
    【树形DP】BZOJ 3829 Farmcraft
    【树形DP】JSOI BZOJ4472 salesman
    【迷宫问题】CodeForces 1292A A NEKO's Maze Game
  • 原文地址:https://www.cnblogs.com/XHappyness/p/11752147.html
Copyright © 2011-2022 走看看