<template><div><!-- 假设这里有多个 div 元素,通过 v-for 循环生成 --><div v-for="index in 10" :key="index" :ref="(el) => setref({el, index})">这是第 {{ index }} 个 div 元素</div><button @click="addClassNameToElement('field1', 'active')">为第 1 个元素添加类名</button></div>
</template><script setup>
import { useSlideState } from './slideState.js';const slideStateStore = useSlideState();// 定义 setref 函数
const setref = (data) => {slideStateStore.setElementRef(data);
};// 为指定字段对应的元素添加类名
const addClassNameToElement = (field, className) => {slideStateStore.addClassToElement(field, className);
};
</script><style scoped>
.active {color: red;
}
</style>
import { defineStore } from 'pinia';export const useSlideState = defineStore('slideState', {state: () => ({elementRefs: {}}),actions: {setElementRef(data) {const { el, index } = data;const field = `field${index}`;this.elementRefs[field] = el;},getElementRef(field) {return this.elementRefs[field];},addClassToElement(field, className) {const element = this.elementRefs[field];if (element) {element.classList.add(className);}}}
});
代码解释
- Pinia 存储:setElementRef 方法接收一个包含 el 和 index 的对象,从对象中提取 el 和 index,并使用 index 生成字段名,将 el 存储到 elementRefs 对象中。
- 组件:通过 v-for 循环生成多个 div 元素,每个 div 元素的 :ref 绑定一个箭头函数,将包含 el 和 index 的对象传递给 setref 函数。setref 函数将这个对象传递给 Pinia 存储中的 setElementRef 方法。
通过这种方式,你可以将包含 el 和 index 的对象传递给 setref 函数,并正确存储和使用这些 ref。