vue组件改变标签属性is的值来动态切换组件内容

灰太狼 2023-01-05 14:28 217阅读 0赞

首先描述一下我们经常在项目中遇到的需求:
比如我们要写一个弹窗,弹窗里显示的是表单内容,但是表单内容会根据进入前选择的状态不通显示的表单内容不通,也就是说,这个弹窗里面有多个个不同的表单在各自状态下子在弹窗中渲染,这个时候我们就需要封装一个组件,但是组件不能是死的,我们要通过is名称来动态的切换组件显示;

写两个表单组件

hive详情表单组件

  1. <template>
  2. <div class="hive_control">
  3. <!-- Oracle弹窗内容 -->
  4. <el-form :model="form" label-width="100px" :disabled="true">
  5. <el-form-item label="资源名称" prop="zyType">
  6. <el-input v-model="form.resourceName"></el-input>
  7. </el-form-item>
  8. <el-form-item label="所属项目" prop="zyType">
  9. <el-input v-model="form.projectName"></el-input>
  10. </el-form-item>
  11. <el-form-item label="数据库名" prop="zyType">
  12. <el-input v-model="form.dbName"></el-input>
  13. </el-form-item>
  14. <el-form-item label="用户名" prop="zyType">
  15. <el-input v-model="form.userName"></el-input>
  16. </el-form-item>
  17. </el-form>
  18. </div>
  19. </template>
  20. <script>
  21. export default {
  22. data() {
  23. return {
  24. form: { }
  25. }
  26. },
  27. props: ['value'],
  28. methods: {
  29. formData() {
  30. this.form = this.value;
  31. }
  32. }
  33. }
  34. </script>

MySQL详情表单组件

  1. <template>
  2. <div class="mySQL_control">
  3. <!-- MySQL弹窗内容 -->
  4. <el-form :model="form" label-width="100px" :disabled="true">
  5. <el-form-item label="资源名称" prop="zyType">
  6. <el-input v-model="form.resourceName"></el-input>
  7. </el-form-item>
  8. <el-form-item label="所属项目" prop="zyType">
  9. <el-input v-model="form.projectName"></el-input>
  10. </el-form-item>
  11. <el-form-item label="数据库类型" prop="zyType">
  12. <el-input v-model="form.resourceType"></el-input>
  13. </el-form-item>
  14. <el-form-item label="IP" prop="zyType">
  15. <el-input v-model="form.host"></el-input>
  16. </el-form-item>
  17. </el-form>
  18. </div>
  19. </template>
  20. <script>
  21. export default {
  22. data() {
  23. return {
  24. form: { }
  25. }
  26. },
  27. props: ['value'],
  28. methods: {
  29. formData() {
  30. this.form = this.value;
  31. }
  32. }
  33. }
  34. </script>

先在项目中写一个弹窗组件

  1. <template>
  2. <el-dialog title="弹窗名称" :visible.sync="dialogVisible" width="540px">
  3. <component :is="componentType" :value='formValue' ref="sourceChild"></component>
  4. </el-dialog>
  5. </template>
  6. import MySQL from './MySQL.vue'
  7. import hive from './hive.vue'
  8. export default {
  9. data(){
  10. dialogVisible:false,
  11. formValue:{ //这里把渲染数据写死,项目中肯定是从后端接口获取不同的数据
  12. resourceName:'hive',
  13. projectName:'项目1',
  14. resourceType:'MySQL ',
  15. dbName:'MySQL ',
  16. userName:'你好',
  17. host:'172.89.32.2'
  18. },
  19. componentType:'MySQL'
  20. },
  21. components: {
  22. MySQL,
  23. hive,
  24. },
  25. methods:{
  26. showConponent() {
  27. //根据路由跳转带过来的type去决定componentType的值来渲染哪个表单内容
  28. let type = this.$route.query.type;
  29. if (type === 'MySQL') {
  30. this.componentType= 'MySQL'
  31. } else {
  32. this.componentType= 'hive'
  33. }
  34. },
  35. openDialog() { //打开弹窗,触发子组件内方法渲染数据
  36. this.dialogVisible= true;
  37. setTimeout(() => {
  38. this.$refs.sourceChild.formData()
  39. }, 300)
  40. },
  41. }
  42. }

这里只写了两个简单的表格,如果还有多个不同表单内容,只需要写好表单组件,引入注册,在showConponent方法做好判断就可以!

发表评论

表情:
评论列表 (有 0 条评论,217人围观)

还没有评论,来说两句吧...

相关阅读