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-Z\d_]*$/; let reg = /^t\d+$/; 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-

浙公网安备 33010602011771号