zoukankan      html  css  js  c++  java
  • vue——【v-model实现原理】

    1.使用v-model封装一个自定义组件:inputTableForm.vue

    <template>
      <el-form
        label-position="top"
        size="mini"
        :rules="rules"
        :model="form"
      >
        <el-form-item
          prop="name"
          style="margin-bottom:0"
        >
          <el-input
            :disabled="disabled"
            @change="handleChange"
            v-model="form.name"
          />
          <template
            slot="error"
            slot-scope="scope"
          >
            <span style="color:#f56c6c;font-size:12px">{{ scope.error }}</span>
          </template>
        </el-form-item>
      </el-form>
    </template>
    <script>
    import _ from "lodash";
    export default {
      data() {
        // eslint-disable-next-line
        let partten = /^[a-zA-Z$_][a-zA-Zd_]*$/;
        let reg = /^td+$/;
        var validateName = (rule, value, callback) => {
          if (!value) {
            callback(new Error("请输入表名"));
            this.backToOriginName();
          } else {
            if (value == this.oldValue) {
              callback();
            } else {
              if (!partten.test(value)) {
                callback(new Error("表名格式不正确"));
                this.backToOriginName();
              } else if (this.tableData.map(v=>v.tablename==value).length >= 2) {
                callback(new Error("表名重复"));
                this.backToOriginName();
              } else if (reg.test(value)) {
                callback(new Error("t+数字是系统默认名称,不能使用"));
                this.backToOriginName();
              } else {
                callback();
              }
            }
          }
        };
    
        var rules = {
          name: [
            { required: true, message: "请输入表名", trigger: "change" },
            { validator: validateName, trigger: "blur" },
          ],
        };
        return {
          oldValue: "",
          rules: rules,
          form: {
            name: "",
          },
        };
      },
      props: {
        value: {
          type: String,
          default: "",
        },
        tableData: {
          type: Array,
          default() {
            return [];
          },
        },
      },
      computed: {
        disabled() {
          return false;
        },
      },
      created() {
        this.form.name = this.value;
        this.oldValue = _.cloneDeep(this.value);
        // console.log(this.value, 111);
      },
      watch: {
        value(val) {
          this.form.name = val;
          // console.log(val, '监听更新');
        },
        // value: {
        //   immediate: true,
        //   handler(val) {
        //     this.form.name = val || '';
        //     this.oldValue = _.cloneDeep(val || '');
        //     console.log(val, '监听更新111');
        //   }
        // },
      },
      methods: {
        handleChange(val) {
          this.$emit("input", val);
          // console.log(val, 222);
        },
        backToOriginName() {
          setTimeout(() => {
            this.$emit("input", this.oldValue);
            // console.log(this.oldValue, 333);
          }, 1000);
        },
      },
    };
    </script>

    2.引用组件:

    <template>
      <div>
        <el-form
          label-position="top"
          :model="forn"
          :rules="rules"
        >
          <el-form-item
            label="接入组件:"
            prop="table"
          >
            <el-table
              :data="inputtable"
              :show-header="false"
              border
            >
              <el-table-column prop="tablename">
                <template slot-scope="scope">
                  <inputTableForm
                    :table-data="inputtable"
                    :key="scope.row.$index"
                    v-model="scope.row.tablename"
                  />
                </template>
              </el-table-column>
              <el-table-column prop="tablevalueText">
                <template slot-scope="scoped">
                  <span>{{ inputtableMatch[scoped.row.tablevalue] }}</span>
                </template>
              </el-table-column>
            </el-table>
          </el-form-item>
        </el-form>
      </div>
    </template>
    
    <script>
     import inputTableForm from './inputTableForm.vue'
      components: {
          inputTableForm ,
      },
      data () {
        return {
          inputtable:[],
          inputtableMatch:{},
          form:{ table:[]},
          rules: {
            table: [
              { type: 'array', required: true, message: '接入组件不可为空', trigger: 'change' }
            ],
          },
        } 
    </script> 

    -end-

  • 相关阅读:
    转dhdhtmlxTree
    转Merge的用法
    解决SqlServer2008评估期过期
    借鉴一下对比算法
    Asp.Net异常:"由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值"的解决方法
    查看Windows下引起Oracle CPU占用率高的神器-qslice
    今日有奖活动一览
    【分享】给做技术的战友们推荐一个不错的微信公号解解闷
    Unreal Engine Plugin management
    当在ECLIPSE中import现存项目时,如遇到版本不符
  • 原文地址:https://www.cnblogs.com/wheatCatcher/p/13633520.html
Copyright © 2011-2022 走看看