v-for遍历的多个组件切换图片 如何不相互影响?

通过循环出来的 van-collapse tags van-image 相互切换图片 不相互影响

image.png

<van-collapse v-model="activeNames">
      <template v-for="(item, index) in data">
        <van-collapse-item :title="item.title" :name="item.name" icon="stop">
          <tags :tagData="item.category" :type="'card'" @change="changeTab" :active="current"></tags>
          <van-image width="100%" height="auto" :src="yl" />
        </van-collapse-item>
      </template>
    </van-collapse>

数据

  data: [
        {
          title: "潜在分布区预测",
          id: '1',
          category: [
            {
              name: "鱼卵潜在分布区",
              src: require('../../assets/images/yl.jpg')
            },
            {
              name: "仔稚鱼潜在分布区",
              src: require('../../assets/images/yl2.jpg')
            },
            {
              name: "寡节甘吻沙蚕潜在分布区",
            },
            {
              name: "脆壳理蛤潜在分布区",
            },
            {
              name: "江户明樱蛤潜在分布区",
            },
            {
              name: "不倒翁虫潜在分布区",
            },
            {
              name: "绒毛细足蟹潜在分布区",
            }
          ]
        },
        {
          title: " 物种丰度预测",
          id: '2',
          category: [
            {
              name: "夜光藻丰度"
            }
          ]
        },
        {
          title: "生物量预测",
          id: '3',
          category: [
            {
              name: "各功能组生物量"
            },
            {
              name: "蓝点马鲛生物量"
            },
            {
              name: "鳀科生物量"
            },
            {
              name: "斑鰶生物量"
            },
            {
              name: "青鳞小沙丁生物量"
            },
            {
              name: "小黄鱼生物量"
            },
            {
              name: "蟹类生物量"
            },
            {
              name: "虾类生物量"
            },
            {
              name: "口虾蛄生物量"
            },
            {
              name: "头足类生物量"
            },
            {
              name: "棘皮动物生物量"
            },
            {
              name: "软体动物生物量"
            },
            {
              name: "浮游动物生物量"
            },
            {
              name: "浮游植物生物量"
            }
          ]
        },
        {
          title: "食物网结构与功能预测",
          id: '4',
          category: [
            {
              name: "食物网结构"
            },
            {
              name: "关键种"
            },
            {
              name: "能量传递效率"
            },
            {
              name: "成熟度与稳定性"
            }
          ]
        }
      ]

每个 category 都有一个src的图片

现在这种写法 总是相互影响,要么总是一个图片,要么所有图片都在一个tag下

现在这种写法 总是相互影响,要么总是一个图片,要么所有图片都在一个tag下

阅读 810
avatarAI BotBETA

看起来你希望在循环中为每个组件生成独立的图片,而不是多个组件共享一个图片。根据你提供的代码,问题可能在于你没有为每个组件生成唯一的图片 URL。

在你的代码中,你使用了 require('../../assets/images/yl.jpg') 来获取图片。这种方式在 Node.js 环境中是可以的,但在客户端渲染的环境中可能不会工作,因为同样的 URL 可能已经被其他组件使用。

一个解决方案是为每个 item 生成一个唯一的 src URL。例如,你可以使用 item.iditem.name 来生成 URL。

例如:

{
  title: "潜在分布区预测",
  id: '1',
  category: [
    {
      name: "鱼卵潜在分布区",
      src: require(`../../assets/images/yl${item.id}.jpg`)
    },
    ...
  ]
}

在这个例子中,每个 itemsrc 都会添加 item.id 后缀,这样就可以确保每个 item 都有自己独立的图片 URL。

2 个回答

所以你的 <van-image> 组件中的 src 值为啥是 yl,而不是 item.src ??

Edit 1

所有的 van-image 组件的 src 属性共用 1 个变量了,那你操作了 yl 肯定会影响到所有的使用到 yl 变量的 image 组件。


Edit 2

看你的描述和截图,大概的业务需求是这样的。
循环渲染一个折叠版面 里面有一个自定义的按钮切换Tags组件,每次切换Tag会联动修改这个自定义组件同级的图片展示组件的 src 属性来期望展示不同的预览图。

所以你可以在 data 这个对象数组中的 item 中增加一个 preview 属性。每次切换的时候取去修改对应的 preview 属性,比如说:

<van-collapse v-model="activeNames">
  <template v-for="(item, index) in data">
    <van-collapse-item :title="item.title" :name="item.name" icon="stop">
-      <tags :tagData="item.category" :type="'card'" @change="changeTab" :active="current"></tags>
+      <tags :tagData="item.category" :type="'card'" :active="current" @change="(url) => changeTab(url, index)" ></tags>
-      <van-image width="100%" height="auto" :src="yl" />
+      <van-image width="100%" height="auto" :src="item.preview" />
    </van-collapse-item>
  </template>
</van-collapse>
export defaut {
  methods: {
    changeTab(url, index) {
      this.$set(this.data[index], 'preview', url)
    }
  }
}
// 数据示例
const data = [
  {
    title: "潜在分布区预测",
    id: '1',
    preview: '',
    category: [ ... ]
  }
]

当然你也可以换一个思路,既然你的 <tags> 组件都有一个 active 属性了。那么直接就用这个绑定的 current 属性来控制 <van-image>src 属性也可以,但是我看了一下你的 current 变量也是有问题的,修改一个应该全部都会被修改掉。所以稍作修改可以这样来处理:

<van-collapse v-model="activeNames">
  <template v-for="(item, index) in data">
    <van-collapse-item :title="item.title" :name="item.name" icon="stop">
-     <tags :tagData="item.category" :type="'card'" @change="changeTab" :active="current"></tags>
+     <tags :tagData="item.category" :type="'card'" :active="item.active" @change="(name) => onTagsChange(name, index)" ></tags>
-     <van-image width="100%" height="auto" :src="yl" />
+     <van-image width="100%" height="auto" :src="getPreviewImage(item.category, item.active)" />
    </van-collapse-item>
  </template>
</van-collapse>
export defaut {
  methods: {
    onTagsChange(key, index) {
      this.$set(this.data[index], 'active', key)
    },
    getPreviewImage(list, activeName) {
        const activeData = list.find(data => data.name === activeName)
        return activeData.src
    }
  }
}
// 数据示例
const data = [
  {
    title: "潜在分布区预测",
    id: '1',
    active: '鱼卵潜在分布区',
    category: [ ... ]
  }
]

没看到懂:src="yl",你这个不是动态的获取图片的么? 个人思路仅参考,有点没看懂:src="yl"

<van-image width="100%" height="auto" :src="yl" />
//:src="yl" 不对吧

//或者你yl是一个变量通过changeTab
changeTab(v){
    //点击哪个tab key值
     let tabNum = v 
    //拿到tabNum去你的data中去找主键
    let arr = this.data.category
    arr.forEach((item) => {
        if(item.id==tabNum){
            this.yl=item.src
        }
    }
}

数据结构:
 category: [
        {
          id:"1",
          name: "鱼卵潜在分布区",
          src: require('../../assets/images/yl.jpg')
        },
        {
          id:"2",
          name: "仔稚鱼潜在分布区",
          src: require('../../assets/images/yl2.jpg')
        },
      ]
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题