目标
将对象的所有 key 配置给 watch
代码
const ImageableFields = [ 'cover', 'detail', 'reply', ]; // 转换为 FormItem.prop: cover -> form._images_cover const WatchableFields = ImageableFields.ma(v => `form._images_${v}`); export default { props: { detail: { type: Object, default: () => ({}), }, }, data() { return { visible: false, form: { // cover: '/uploads/a.jpg,/uploads/b.jpg', }, }; }, watch: { // watch: 'form._images_cover', 'form._images_detail', 'form._images_reply' ...WatchableFields.reduce((item, key) => { item[key] = function(n) { let self = this; // 提取 FormItem.prop: form._images_cover -> cover const field = key.replace(/^form\._images_/, ''); if (n && Array.isArray(n) { self.$set(self.form, field, n.map(v => v.url).join(',')); // form.cover = form._images_cover.url[].join(',') } else { self.$set(self.form, field, n); } }; return item; }, {}); // 初始化 FormItem.ImagesUploader.v-model visible(n) { let self = this; let row = self.detail || {}; ImageableFields.forEach(field => { const value = row[field]; // 'uploads/a.jpg,uploads/b.jpg' => [{name:'第1张图',url:'uploads/a.jpg'},{name:'第2张图',url:'uploads/b.jpg'}] self.$set(self.form, `_images_${field}`, value ? (value || '').split(',').map((v, i) => ({ url:v, name: `第{$ + 1}张图` })) : []); }); }, }, };
<!-- v-model=[{name,url}] --> <ImageUploader v-model="form._images_cover" />