欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

用v-for实现element ui的折叠面板el-collapse(点击一个面板总是全部打开)

程序员文章站 2022-03-13 12:35:35
...

想要通过v-for实现element ui的折叠面板,点击某一个面板就展开它的功能;
结果点开某一个面板总是把所有面板都打开了;
有问题的源代码:

  1. <el-collapse v-model="activeNames" @change="collapseHandleChange">
  2. <el-collapse-item v-for="(item,index) in result" name="index">
  3. <template slot="title">
  4. {{ index }}->{{ item.origin }}-> {{ item.pol }} ->{{ item.pod }}
  5. </template>
  6. <div>与现实生活一致:与现实生活的流程、逻辑保持一致,遵循用户习惯的语言和概念;</div>
  7. <div>在界面中一致:所有的元素和结构需保持一致,比如:设计样式、图标和文本、元素的位置等。</div>
  8. </el-collapse-item>
  9. </el-collapse>

猜测是el-collapse-item元素的name参数的问题,将name各种改,改成name=”item.id”等都不行。
后来看到别人的代码中有不写name参数的,尝试将name删除,之后就实现了想要的功能
修改之后的代码(collapse-item没有了name参数):

  1. <el-collapse v-model="activeNames" @change="collapseHandleChange">
  2. <el-collapse-item v-for="(item,index) in result">
  3. <template slot="title">
  4. {{ index }}->{{ item.origin }}-> {{ item.pol }} ->{{ item.pod }}
  5. </template>
  6. <div>与现实生活一致:与现实生活的流程、逻辑保持一致,遵循用户习惯的语言和概念;</div>
  7. <div>在界面中一致:所有的元素和结构需保持一致,比如:设计样式、图标和文本、元素的位置等。</div>
  8. </el-collapse-item>
  9. </el-collapse>

问题的原因大概是,name参数是折叠项的唯一标志符,我将name定义为for循环中的index或者item.id就是希望它是唯一的,但是name属性似乎没有将index和item.id当做v-for循环中的参数,而是把他们当成了一个字符串;也就是说实际上我原来所定义的每一个折叠项的name都是相同的,所以才会每次一点击就把所有折叠项都打开了。

为什么vue官网的v-for的例子中,key就可以用item.message的方式定义呢,它怎么没有把item.message识别为一个字符串呢?
记得之前看到一篇博文上讲的有冒号和没有冒号的参数的区别,有冒号的参数vue将其识别为一个变量或表达式,没有冒号的参数vue会将其识别为一个字符串类型的字面量,我定义的name参数前面没有冒号(:),vue实例中的key参数前面有冒号(:),就是造成这种区别的原因。

  1. <ul id="example-1">
  2. <li v-for="item in items" :key="item.message">
  3. {{ item.message }}
  4. </li>
  5. </ul>

想清楚问题的原因之后,就可以即定义name属性又实现点击时只打开一个面板的功能了,方法就是在collapse-item的name参数前加上冒号(:)

  1. <el-collapse v-model="activeNames" @change="collapseHandleChange">
  2. <el-collapse-item v-for="(item,index) in result" :name="index">
  3. <template slot="title">
  4. {{ index }}->{{ item.origin }}-> {{ item.pol }} ->{{ item.pod }}
  5. </template>
  6. <div>与现实生活一致:与现实生活的流程、逻辑保持一致,遵循用户习惯的语言和概念;</div>
  7. <div>在界面中一致:所有的元素和结构需保持一致,比如:设计样式、图标和文本、元素的位置等。</div>
  8. </el-collapse-item>
  9. </el-collapse>