想要通过v-for实现element ui的折叠面板,点击某一个面板就展开它的功能;
结果点开某一个面板总是把所有面板都打开了;
有问题的源代码:
<el-collapse v-model="activeNames" @change="collapseHandleChange">
<el-collapse-item v-for="(item,index) in result" name="index">
<template slot="title">
{{ index }}->{{ item.origin }}-> {{ item.pol }} ->{{ item.pod }}
</template>
<div>与现实生活一致:与现实生活的流程、逻辑保持一致,遵循用户习惯的语言和概念;</div>
<div>在界面中一致:所有的元素和结构需保持一致,比如:设计样式、图标和文本、元素的位置等。</div>
</el-collapse-item>
</el-collapse>
猜测是el-collapse-item元素的name参数的问题,将name各种改,改成name=”item.id”等都不行。
后来看到别人的代码中有不写name参数的,尝试将name删除,之后就实现了想要的功能
修改之后的代码(collapse-item没有了name参数):
<el-collapse v-model="activeNames" @change="collapseHandleChange">
<el-collapse-item v-for="(item,index) in result">
<template slot="title">
{{ index }}->{{ item.origin }}-> {{ item.pol }} ->{{ item.pod }}
</template>
<div>与现实生活一致:与现实生活的流程、逻辑保持一致,遵循用户习惯的语言和概念;</div>
<div>在界面中一致:所有的元素和结构需保持一致,比如:设计样式、图标和文本、元素的位置等。</div>
</el-collapse-item>
</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参数前面有冒号(:),就是造成这种区别的原因。
<ul id="example-1">
<li v-for="item in items" :key="item.message">
{{ item.message }}
</li>
</ul>
想清楚问题的原因之后,就可以即定义name属性又实现点击时只打开一个面板的功能了,方法就是在collapse-item的name参数前加上冒号(:)
<el-collapse v-model="activeNames" @change="collapseHandleChange">
<el-collapse-item v-for="(item,index) in result" :name="index">
<template slot="title">
{{ index }}->{{ item.origin }}-> {{ item.pol }} ->{{ item.pod }}
</template>
<div>与现实生活一致:与现实生活的流程、逻辑保持一致,遵循用户习惯的语言和概念;</div>
<div>在界面中一致:所有的元素和结构需保持一致,比如:设计样式、图标和文本、元素的位置等。</div>
</el-collapse-item>
</el-collapse>