现有一个已知数据源 listData, 使用vue语法,根据此数据源在 ul 标签中遍历生成 li 标签。 并实现:点击当前 li 元素 该元素变为选中状态,其他 li 为未选中状态.
代码片段
<template>
<div>
<ul>
<ul>
</div>
</template>
<script>
const listData = [
{
id:1,
name: '123'
},
{
id:2,
name: '456'
},
{
id:3,
name: '789'
}
]
export default {
data () {
return {
}
}
}
</script>
写一个事件 点击的时候将当前点击的下标保存起来 然后将对应下标的li改为选中的类
<template>
<div class="hello">
<div>
<ul>
<li
v-for="(item, index) of listData"
:class="{ active: active == index }"
@click="setIndex(index)"
:key="index"
>
{{ item.name }}
</li>
</ul>
</div>
</div>
</template>
<script>
export default {
name: "HelloWorld",
props: {
msg: String,
},
data() {
return {
listData: [
{
id: 1,
name: "123",
},
{
id: 2,
name: "456",
},
{
id: 3,
name: "789",
},
],
active: "",
};
},
methods: {
setIndex(index) {
this.active = index;
},
},
};
</script>
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
h3 {
margin: 40px 0 0;
}
ul {
list-style-type: none;
padding: 0;
}
li {
display: inline-block;
margin: 0 10px;
}
a {
color: #42b983;
}
.active {
color: #f00;
}
</style>
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<title> 页面名称 </title>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<style type="text/css">
.sd {
background-color: #ccf;
}
</style>
</head>
<body>
<div id="app">
<ul v-for="obj in listData">
<li :class="{sd: sdid==obj.id}" @click="sdid=obj.id">{{obj.id}} {{obj.name}}</li>
</ul>
</div>
<script type="text/javascript">
const listData = [
{
id:1,
name: '123'
},
{
id:2,
name: '456'
},
{
id:3,
name: '789'
}
]
var app = new Vue({
el: '#app',
data() {
return {
listData: listData,
sdid: 1
}
}
});
</script>
</body>
</html>
定义一个当前li的index属性 currli,用动态class绑定 :class="currli == index?'选中的样式class':'未选中的样式class ' "
v-for遍历listData,得到<li>标签
用动态改变类的方式来实现
可先定义一个选中状态时的类
根据其点击选中的li,传入其对应的索引值(索引值的获取是通过用v-for循环li时得到对应的index)
在改变类的时候,通过传过来的索引值和当前选中的索引值做一个比较,即:class="current === li.index ? "选中状态的类":"未选中状态的类" ,其中current值要在data中定义初始化为1
您好,我是有问必答小助手,你的问题已经有小伙伴为您解答了问题,您看下是否解决了您的问题,可以追评进行沟通哦~
如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~
ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632
写了两个文件,一个组件文件,一个引用文件,用到了css框架stylus。
组件文件selectList.vue
<template>
<div id="select_list">
<ul>
<li v-for="(item,index) in list" :key="item.id ? item.id : index"
:class="item.id == selectId ? 'li_item_selected' :''" @click="selectItem(item)">
{{item.name}}
</li>
<ul>
</div>
</template>
<script>
export default {
props: {
list: {
type: Array,
default: () => {
return []
}
}
},
data () {
return {
selectId: -1
}
},
methods: {
selectItem (item) {
this.selectId = item.id
this.$emit('getItem', item)
}
}
}
</script>
<style lang="stylus" scoped>
#select_list{
ul{
li{
background #fff
}
.li_item_selected{
background #ff5722
}
}
}
</style>
引用文件:components.vue
<template>
<div id="test">
<div class="select_list">
<selectList :list="list" @getItem='getItem'></selectList>
</div>
</div>
</template>
<script>
import selectList from '../components/selectList'
export default {
components: {
selectList
},
data () {
return {
list: [
{
id: 1,
name: '诸葛'
},
{
id: 2,
name: '司马'
},
{
id: 3,
name: '欧阳'
}
]
}
},
methods: {
getItem (item) {
alert('你点击了' + item.name)
}
}
}
</script>
<style lang="stylus" scoped>
#test{
height 600px
display flex
justify-content center
align-items center
flex-wrap wrap
.select_list{
width 600px
}
}
</style>
实际效果:
刚敲得,哈哈
<template>
<div>
<ul>
<li v-for="(i,item)in listData" :key="item.id" :class="active==i?'选中状态的类名':'未选中的类名'" @click="ActiveItem(i)">{{item.id}}</li>
<ul>
</div>
</template>
<script>
export default {
data () {
return {
active:-1,
listData:[
{
id:1,
name: '123'
},
{
id:2,
name: '456'
},
{
id:3,
name: '789'
}
]
}
},
methods:{
ActiveItem(i){
this.active = i;
}
}
}
</script>
非常感谢您使用有问必答服务,为了后续更快速的帮您解决问题,现诚邀您参与有问必答体验反馈。您的建议将会运用到我们的产品优化中,希望能得到您的支持与协助!
速戳参与调研>>>https://t.csdnimg.cn/Kf0y