1、vue component-is动态组件,props可根据每个组件配置传入,但是如果要给被渲染的组件添加v-model,比如 is='input' v-modal="value", 而这个input里面编辑的值可以和外界同步吗,会不会报出 子组件内不可修改父组件传递的prop值的错误?
2、用 v-if 替换component-is组件合适吗?
<!-- //输入框 -->
<finput v-if="info.component === 'input'" v-model="info.modal" :info="info" />
<!-- //单选下拉-->
<SingleSelect v-else-if="info.component === 'single-select'" v-model="info.modal" :info="info" />
<!-- //单个日期选择-->
<SingleDate v-else-if="info.component === 'single-date'" v-model="info.modal" :info="info" />
<!-- //时间范围选择24小时-->
<timeRange v-else-if="info.component === 'time-range'" v-model="info.modal" :info="info" />
<!-- //数字输入-->
<inputNumber v-else-if="info.component === 'input-number'" v-model="info.modal" :info="info" />
<!-- //单选框-->
<fradio v-else-if="info.component === 'fradio'" v-model="info.modal" :info="info" />
<p v-else>未知组件</p>
4、可否用h.render方式呢 如何实现
1、vue组件化的初衷是为了把通用的功能抽离出来,减少代码之间的耦合,达到可复用的目的,这种写法无异于把变量定义在父组件,这样子组件也无法复用,还不如把表单等输入框直接写在父组件,还直观一些,你说对么
2、vue内置组件component--通过is属性动态渲染组件操作 和这种采用多个v-if的方式没有任何区别,只是官方已经封装好了,且更为简洁,开箱即用,建议使用官方封装好的api
3 、等到项目复杂,模块功能多的时候,你也会去修改别人代码时候,你就会体会到统一规范,对于维护代码有多方便啦
4、我举例一个场景,你这个一个组件的变量要在全局使用,你该如何解决呢,你这种思路很快就有瓶颈,我们会使用vuex来管理各种状态机制,
而不是存放在父组件里面
<!-- //输入框 -->
<finput v-if="info.component === 'input'" v-model="info.modal" :info="info" />
<!-- //单选下拉-->
<SingleSelect v-else-if="info.component === 'single-select'" v-model="info.modal" :info="info" />
<!-- //单个日期选择-->
<SingleDate v-else-if="info.component === 'single-date'" v-model="info.modal" :info="info" />
<!-- //时间范围选择24小时-->
<timeRange v-else-if="info.component === 'time-range'" v-model="info.modal" :info="info" />
<!-- //数字输入-->
<inputNumber v-else-if="info.component === 'input-number'" v-model="info.modal" :info="info" />
<!-- //单选框-->
<fradio v-else-if="info.component === 'fradio'" v-model="info.modal" :info="info" />
<p v-else>未知组件</p>
这种写法可以实现效果,也没有错,但我们不推荐,因为后期你会去维护别人的项目,别人也会维护你的项目,
当这个组件需要被多个地方复用,组件的变量需要全局使用,这种写法就不适用了,还是建议以官方推荐方法来书写代码
不能直接修改父组件的值这是肯定的 可以$emit
v-if 显示组件也没有问题 只不过代码多了
可以试试component-is 能否可行 用render的话也可以 得看你这些自定义组件的v-model的实现方式
1、自定义组件 v-model 的双向绑定是不会报 子组件修改父组件错误的,v-model实质就是子组件内通过emit去触发,进而修改了父组件的内容
比如常见ui库 vant,弹窗的双向绑定也是用的v-model
2、v-if也没什么问题,只是个人觉得,可以考虑把部分表单类组件封装一起,根据prop的type值去渲染对应的组件
3、render只是手动编写render函数,和你需求关系貌似不大
1.如果peops接收的是对象,子组件可以直接修改对象里的属性,父组件能够保持同步;如果不是的话可以用.sync修饰符+$emit(update:xxx)的方式保持同步。
2.相比一堆v-if,component-is当然是更好的选择,可以考虑结合动态引入组件使用,避免引入用不到的资源。
3.应该可以,不过我自己没写过,可以看下这个帖子满足你需要不https://blog.csdn.net/qdmoment/article/details/106200145
这个肯定会报错的,如果还不太明白父子组件传值的原理,可以使用v-if代替,需要传值的话可以用session.set()存值,然后在子页面取值session.get(),这样互不影响。方法有很多!
可能是我问题描述的不清楚,一句话总结:如何将上述代码优雅的写出来,加入说有30个组件分类,不可能使用v-if一个一个去判断了,这个时候该怎么办,这个问题一直保留,答得好的会有打赏