elementUI的动态tabs页的使用,vue的动态组件的操作

news/2024/7/10 2:10:13 标签: vue

vue_0">elementUI的动态tabs页的使用,vue的动态组件的操作

有时候我们需要用到动态的tab页,结合不同的页面内容来显示。这里是使用了elementUI的动态tabs页来实现的

<div class="right" v-loading="loading">
    <div class="between main-top">
          <span @click="addTab(editableTabsValue,'groupInfo(组件的名称)','tabs页的名称')">add tabs</span>
    </div>
   <el-tabs v-model="editableTabsValue" type="card" @tab-remove="removeTab">
    <el-tab-pane v-for="(item, index) in editableTabs" :key="index" :label="item.title" :name="item.name" :closable='item.closable'>
        <component :is='item.content' :objId='objId' @fatherEvent="btnclick" @delTab='delTabs'></component>
         <!-- 
		:closable='item.closable' ----通过closable来判断当前tabs是否可以关闭
		component:通过使用component元素,在根据组件中的is属性来动态的切换不同的组件。
		:is='item.content':这是动态绑定的组件
		:objId='objId'  ----这个是组件之间的传值,父组件传值给子组件的
		@fatherEvent="btnclick" ----这是子组件对父组件的操作
		@delTab='delTabs' ----这是子组件对父组件的操作
		-->
     </el-tab-pane>
   </el-tabs>
</div>
//---------------------引入组件的模块
import chat from './chat'
import create from './create'
import statements from './statements'
import groupInfo from './groupInfo'
import renew from './renew'
import project from './project'
export default {
  props: {},
  components: {
    chat,
    statementsGnode,
    createGnode,
    groupInfo,
    renewGnode,
    project
  },
 data() {
    return {
      editableTabsValue: '1',
      editableTabs: [{//第一个默认打开的tabs
        title: '项目通讯',//tabs页的名称
        name: '1',
        content: chat,//对应组件名称
        closable:false// 是否可以关闭,false是不可以,true是可以关闭
      }],
      tabIndex: 1,
      //动态子组件
      objId:'',
    };
  },
addTab(targetName,name,title) {//----------------这是添加tabs页的方法,三个值对应着上面点击方法传过来的,但是也不是三个都要,第一个值是必须要传的
        let newTabName = ++this.tabIndex + '';
        if (name === 'statements') {//------------------这几个判断是我要区分开不同的组件所需要的值来做的
          this.objId = title
          this.editableTabs.push({
            title: title.name,
            name: newTabName,
            content: name,
            closable:true
          });
        } else if (name === 'renew'){
          this.objId = title
          this.editableTabs.push({
            title: '够着'+title.name,
            name: newTabName,
            content: name,
            closable:true
          });
        }else{
          this.editableTabs.push({
            title: title,
            name: newTabName,
            content: name,
            closable:true
          });
        }
        
        this.editableTabsValue = newTabName;
      },
      removeTab(targetName) {//--------------这是关闭tab页的
        let tabs = this.editableTabs;
        let activeName = this.editableTabsValue;
        if (activeName === targetName) {
          tabs.forEach((tab, index) => {
            if (tab.name === targetName) {
              let nextTab = tabs[index + 1] || tabs[index - 1];
              if (nextTab) {
                activeName = nextTab.name;
              }
            }
          });
        }
        this.editableTabsValue = activeName;
        this.editableTabs = tabs.filter(tab => tab.name !== targetName);
      },
    btnclick(com,item){//这个子组件点击控制父组件的方法,不同的子组件对应不同的调用
      if (com === "groupInfo") {
        this.ChatMamList();
      } else if(com === 'renewGnode'){
        let value = this.editableTabsValue
        this.addTab(value,com,item)
      }else{
        this.manageNode();
      }
    },
    delTabs(targetName){ //---------------这是子组件想要关闭当前tab页的,控制父组件的操作
      let tabs = this.editableTabs;
      let activeName;
      tabs.forEach((tab, index) => {
        if (tab.title === targetName) { //因为判断不一样
          let nextTab = tabs[index + 1] || tabs[index - 1];
          if (nextTab) {
            activeName = nextTab.name;
          }
        }
      });
      this.editableTabsValue = activeName;
      this.editableTabs = tabs.filter(tab => tab.title !== targetName);
      this.manageNode();
    },

以上是父组件的的代码

下面是子组件的代码

props: {
    objId:{//----------------接受父组件的值
      type:Object
    }
  },
renew(){
      let objInfo = this.objId
      this.Gnodedialog = false
      //调用父组件的方法,fatherEvent--是在父组件的的动态组件component上面的方法,注意看上面的代码
    //'renew',objInfo,都是传值
      this.$emit("fatherEvent",'renew',objInfo) 
}

http://www.niftyadmin.cn/n/861522.html

相关文章

:nth-last-of-child()与:nth-last-of-type()

nth-child(n) ele:nth-child(n)选中ele元素&#xff0c;且ele是某个元素下的第n个元素 p:nth-child(n) ---->选中p元素&#xff0c;且该p元素必须是某个父元素下的第n个子元素 这里的n是从1开始的 li:nth-child(n6)&#xff1a;选中从第6个开始的子元素&#xff08;即n从0…

Flex布局(一)

flex属性是flex-grow, flex-shrink 和 flex-basis的简写&#xff0c;默认值为0 1 auto。后两个属性可选。 flex-grow属性定义项目的放大比例&#xff0c;默认为0。即项目之间占据空间的大小比例。使用该属性便可以按照比例分配完整个主轴空间。 flex-basis属性定义该项目占据主…

获取对象Object的长度

获取对象的长度 obj:{id:1,id2:1,id3:1,id4:1,id5:1,id6:1,id7:1,id8:1,id9:1,id10:1}let i Object.keys(this.obj).lengthconsole.log(i);//10

el-upload的多文件上传

el-upload实现多文件上传的方法 <el-uploadclass"upload-demo"dragaction"#"multipleref"upload":file-list"files":http-request"handleUpload":on-exceedhandExceed:on-remove"handleRemove":on-successhan…

vue使用pdf.js在线预览pdf文件

vue使用pdf.js在线预览pdf文件 1、先去下载pdf.js&#xff0c;打开官网 pdf.js官网 &#xff1a;http://mozilla.github.io/pdf.js/getting_started/#download &#xff08;如果打不开这个网站&#xff0c;可以参考这个博客) 百度网盘 链接: https://pan.baidu.com/s/1CK7nHJO…

vue预览word,excel,pptx,pdf文件

vue预览word&#xff0c;excel&#xff0c;pptx&#xff0c;pdf文件 1、做word&#xff0c;excel&#xff0c;pptx的预览&#xff0c;要先确定文件路径访问是通过域名的url来预览&#xff0c;不可以通过IP的url来访问 先把文件路径的url进行url编码&#xff08;encodeURIComp…

el-card的点击事件失效的解决方式

click link改为click.native link//变成原生绑定

哔哩哔哩2020校园招聘前端笔试卷(一)

在数组里面找数的>双指针 1.以下不是CSS伪类选择器的是&#xff1f; 2. [‘1’, ‘2’, ‘3’].map(parseInt) ( ) [1, 2, 3].map((item, index) > {return parseInt(item, index) }) // 第二个参数表示使用什么进制来转换 parseInt(1, 0) // 1 默认十进制的1 parseIn…