You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vue i18n场景下v-for如何动态拼接key读取多语言JSON对应字段

核心问题原因

你的写法错误是因为对JavaScript对象的动态属性访问规则不熟悉:item.name_[$i18n.locale]的逻辑是尝试访问item下name_对象的对应locale属性,但你实际的字段名是name_en、name_de这类完整拼接的字符串,需要先拼接出完整键名再用方括号访问。

正确基础语法

如果你的每个item的多语言字段前缀固定为name,可以直接按下面的写法修正:

<div v-for="(item, index) in data.items" :key="index">
     <p>{{ item[`name_${$i18n.locale}`] }}</p>
</div>

针对你现有JSON结构的优化方案

你给出的示例JSON中,第一个item的字段前缀是name,第二个是year,直接写死前缀会导致第二个item取不到值,推荐两种适配方案:

方案1:统一多语言字段前缀(推荐)

调整JSON结构,所有多语言值的字段前缀统一,例如都用label:

items: [
  {
    "label_en": "Name",
    "label_de": "Name"
  },
  {
    "label_en": "Year",
    "label_de": "Jahr"
  }
]

对应模板写法:

<div v-for="(item, index) in data.items" :key="index">
  <p>{{ item[`label_${$i18n.locale}`] }}</p>
</div>

方案2:给每个item加字段标识前缀

如果不能修改现有多语言字段的命名,给每个item新增key字段标识前缀:

items: [
  {
    "key": "name",
    "name_en": "Name",
    "name_de": "Name"
  },
  {
    "key": "year",
    "year_en": "Year",
    "year_de": "Jahr"
  }
]

对应模板写法:

<div v-for="(item, index) in data.items" :key="index">
  <p>{{ item[`${item.key}_${$i18n.locale}`] }}</p>
</div>

扩展优化

可以封装一个全局方法简化模板逻辑,避免重复写拼接代码:

// 全局注册或者组件内定义方法
methods: {
  getLocalValue(item, prefix) {
    return item[`${prefix}_${this.$i18n.locale}`]
  }
}

模板中直接调用即可:

<p>{{ getLocalValue(item, 'name') }}</p>

内容的提问来源于stack exchange,提问作者karzol73

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.16 15:06:11