自己给vue2.0第三方组件库打补丁的一种方法
demo预览:
https://sunzsh.github.io/vue-demos/#/form-reset
demo代码:
https://github.com/sunzsh/vue-el-demo/blob/master/src/views/form-reset.vue
组件代码:
https://github.com/sunzsh/vue-el-demo/blob/master/src/components/elFormreInitialValue.js
elementUI的表单组件里有一个重置功能
它可以重置成这个表单最初的样子
但是呢我发现它有个问题
就是假如我这是一个修改界面
我在页面加载的时候
就会初始化一些值上来,像这样
然后呢如果在页面上修改一些东西
这时候再点重置是希望他回到
修改最初的那个样子
但是大家看
他就恢复成空值了
具体的原因一会带大家分析哈
先给大家分享这个解决方案
就是这个插件类似于补丁的插件
有50多行代码吧
然后呢
我们把这个插件放到本地项目里
再main.js里呢把这个插件安装一下
这样的话呢
我们在这页面上如果想...
在这比如说我们初始化的这个值了
我们想在这把这些值
作为他以后点重置的时候恢复的值
怎么办呢
我们调这行的代码
就是我们找到这个form的ref
然后呢调这个reInitialResetValue
这个方法
就是我们通过补丁文件加进去的
然后我们再来分析它原生这个组件
不行的原因
首先呢我们正常点reset
它是调这个resetFileds
这是(elementui)原生的重置方法
所以我们先来看一下这resetFileds
是怎么写的
我们先去找到这个form(el-form)
然后呢我们在这里搜reset fields
在这里
大家看,它是循环这个表单里所有的字段
然后呢
让每一个字段调用它的resetFiled方法
这个field字段是什么呢
其实就是我们常写的这个form item
我们打开form-item(源码)之后啊
还是搜索啊
reset,大家看 在这里reset field
然后呢其他的代码不重要
最重要的是在这在赋值
就是你点那个重置之后啊
他让每一个form-item的值
等于他这个initialValue
注意这里数组他做了一个克隆的操作
至于为什么这样克隆一份
留给大家思考哈
我们就说它这个initialValue是怎么来的
我们再搜这个initial value
在这里大家看
在每一个form-item的mounted的里边
它去取这个属性值
然后呢,还是 如果是数组做了一下克隆
然后注意这儿最重要的是
这儿
它声明了一个只读的initialValue属性
在这里这样声明的属性只是指读的
同时
因为他在这里没有加这个configureable
所以呢他这个属性也是没法
删掉和重新设置的
所以他做的比较绝
那怎么办呢
其实我们最终的目标
首先就需要在这加一个configurable
等于true,这样的话呢
这个属性是可以重新设置的
第二的话呢我们再去重新
去设置这个initialValue的这个value值
就可以了
所以啊我们可以写一个小插件
像这样准备一个新的文件
这里边先把
它原声的form-item和form导进来
为什么导form我们一会再说哈
我们先说form-item
导进来之后我们把它的这个mounted删掉
然后呢我们自己写一个组件
继承原来这个FormItem
然后我们做两件事
第一个呢
我们在mounted里边
原封不动拿过来代码
加一个configurable=true
这样的话呢
这个属性
后期就可以被重新去设置了
然后我们就可以增加一个方法
就要去重新设置这个initial的这个value
好有了这个方法之后
这个表单里的每一个元素
是可以被重新设置这个初始化的值的
对吧
但是我们不能一个一个去设置嘛
所以我们还需要把form导进来
给form增加一个(统一管理的)reInitialResetValue
我们在这form里边循环去修改
所有的字段的这个值
最终呢我们写一个
安装插件的入口
在这里呢
把原来的这个FormItem和Form覆盖掉
用我们新写的这个组件
然后我们在使用的时候就简单了
只要找到这个Form组件
直接调我们新写的这个方法
它就可以了
那我们了解了他之前不行的原因之后
有同学可能会想到
既然他之前这个initialValue啊
是在这个mounted的里边写的
那是不是我们在mounted的之前
把这个filedValue附上值就可以了呢
没错!但我们来试一下啊
我们在这个...
我先把这个方法注掉
我们不去调这个(reInitialResetValue)
然后呢
原来我是在mounted里设置的这个initValues()
这回呢我们把它改成before mount
我们来试一下啊
刷新一下
看看我随便改两个重置它也可以
但是呢这个方案还是有一些局限性的
为什么呢
因为我现在是为了演示啊
这些赋值的代码都是写死的
大多数情况下我们在这是需Ajax查询
然后异步写进来
如果是异步的话呢,代码是不等的
这还没付上值呢
这边mounted他就走了
好最后呢还是老规矩
这个补丁文件的代码啊
我还是放到github上
然后这个入口呢
我也会放到1024bugs里面
最后更新于