计算 属性 或根据 Vue 中 v-for 内的值更改样式的其他方式

Computed property or other way to change style depending on value inside v-for in Vue

我有这样的组件:

Vue.component('mcp-item', {
    template: '#mcp-item-template',
    data() {
        return {
            name: "MCP v2",
            version: "2.0",
            imei: 'XXXXXX XX XXXXXX X',
            relays: [
                { name : "REL1", state : 0 },
                { name : "REL2", state : 0 }
            ],
            inputs: [
                { name: "BP1", state: 0, color: "#CC0000" },
                { name: "BP2", state: 0, color: "#CC0000"  },
                { name: "BP3", state: 1, color: "#00CC00"  },
                { name: "BP4", state: 0, color: "#CC0000"  },
                { name: "BP5", state: 0, color: "#CC0000"  },
                { name: "BP6", state: 0, color: "#CC0000"  }
            ],
        }
    },
    methods: {
        reboot: function (event) { alert( this.imei) }
    }
})

在组件模板的某处:

<table>
    <thead>
        <tr>
            <th>Input</th>
            <th>State</th>
        </tr>
    </thead>
    <tbody v-for="input in inputs" :key="input.name">
        <tr>
            <td :style="{ 'color': input.color}">{{input.name}}</td>
            <td>{{input.state}}</td>
        </tr>
    </tbody>
</table>

如您所见,现在我的对象中有专用的 color 字段(这是 datainputs 数组的元素):

JS:

{ name: "BP1", state: 0, color: "#CC0000" }

HTML:

<td :style="{ 'color': input.color}">{{input.name}}</td>

我想摆脱这个额外的 属性,但我不知道如何在 v-for 循环中使用计算的 属性 来制作红色state==0 的颜色和 state==1 的绿色.

也许计算 属性 是一种矫枉过正 - 简单条件呢:

<td :style="{ 'red': input.state === 0, 'green': input.state === 1}">...// </td>

我不会创建一个计算 属性 或将逻辑添加到模板中,而是创建一个如下所示的方法 getColor(state)

getColor(state) {
  let color = '';
  if (state === 0) {
    color = 'red';
  } else if (state === 1) {
    color = 'green';
  }
  return { color };
}

或者,如果唯一的值是 01,您可以将其缩短为:

getColor(state) {
  const color = state === 0 ? 'red' : 'green';
  return { color };
}

然后这样称呼它:

<td :style="getColor(input.state)">{{input.name}}</td>