【Vue】value值如何通过{{}}获取?答:【:value="item.value"】或者【v-bind:value="item.value"】...

本文介绍如何使用Vue.js创建动态列表,并从本地存储中加载历史记录数据。通过解析本地存储的数据,将其转换为Vue组件可以使用的格式,实现列表项的自动勾选功能。
var historyList = new Vue({
    el: '#historyList',
    data: {
        items: [
            //{text:'3000吨以下',value:'0-3000'},
            //{text:'5000吨 至 1.0w吨',value:'5000-10000'},
            //{text:'55吨 至 88吨',value:'55-88'}
        ]
    }
})


<ul id="historyList" >
    <li v-for="item in items" class="tonList">
        <input type="checkbox" :value="item.value"/>
        <label>{{item.text}}</label>
    </li>
</ul>


function getHistory() {
    var data = localStorage.getItem('tonnage_history');
    if (data != '' && data != null) {
        // dataTextAndValue {3000吨 至 5000吨,5000吨 至 1.0w吨,4吨 至 8吨:3000-5000,5000-10000,4-8}
        var dataTextAndValue = data.split(':');
        // dataText [3000吨 至 5000吨,5000吨 至 1.0w吨,4吨 至 8吨]
        var dataText = dataTextAndValue[0].split(',');
        // dataValue [3000-5000,5000-10000,4-8]
        var dataValue = dataTextAndValue[1].split(',');
        var dataItem=new Array();
        for(var i=0;i<dataText.length;i++){
            dataItem[i]={text:dataText[i],value:dataValue[i]}
        }
        // dataItem
        // [ {text:'3000吨以下',value:'0-3000'},
        // {text:'5000吨 至 1.0w吨',value:'5000-10000'},
        // {text:'55吨 至 88吨',value:'55-88'}]
        historyList.items=dataItem;
    } else {

    }

    console.log(data);
    console.log(dataItem);
    console.log(historyList.items);
}
【1】   <input type="checkbox" :value="item.value"/>
      不是用双括号,直接用引号包围就行,前边加个冒号
      【:】相当于【v-bind:】

【2】   for(var i=0;i<dataText.length;i++){
            dataItem[i]={text:dataText[i],value:dataValue[i]}
         }
      js的数组还可以这样用,牛逼!

https://cn.vuejs.org/v2/api/#v-bind



 

转载于:https://www.cnblogs.com/CESC4/p/7761197.html

<think> 我们分析表达式:`:class="{tegfail:items.type==0?tegsuss:items.type==2}"` 这个表达式存在几个问题: 1. **语法错误**:在Vue的动态类绑定中,我们使用对象语法时,键(key)表示类名,value)是一个布尔,表示是否应用该类。 但是,在这个表达式中,我们使用了一个三元表达式作为,但三元表达式的结果应该是布尔吗?让我们分解: `{ tegfail: items.type==0 ? tegsuss : items.type==2 }` 这里,`items.type==0`是一个条件,如果为真,则为`tegsuss`,否则为`items.type==2`(注意,这里`items.type==2`是一个条件表达式的结果?但实际上,它被写成了一个条件表达式的一部分,但整个三元表达式并没有完成)。 实际上,这个三元表达式写错了。它应该是: `items.type==0 ? ... : ...` 但是,我们注意到,在条件为真时,它返回的是`tegsuss`,这是一个变量(应该是一个布尔?),而条件为假时,返回的是`items.type==2`(这是一个条件判断,返回布尔)。这样,整个三元表达式的结果可能是布尔,也可能是`tegsuss`的(如果`tegsuss`是布尔,那么整体就是布尔;如果不是,就会有问题)。 2. **逻辑问题**:这个表达式试图根据`items.type`的来动态添加`tegfail`类。具体规则是: - 当`items.type==0`时,使用`tegsuss`的(注意,这里`tegsuss`应该是一个布尔变量)来决定是否添加`tegfail`类。 - 当`items.type`不等于0时,则使用`items.type==2`这个条件(即判断`items.type`是否为2)来决定是否添加`tegfail`类。 这样的逻辑可能不是我们想要的。因为: - 在`items.type==0`的情况下,我们并没有直接决定是否添加`tegfail`类,而是依赖另一个变量`tegsuss`,这可能会造成混淆。 - 在`items.type`不等于0的情况下,我们只关心它是否为2,而忽略了其他(比如1,3等)。 3. **可能的意图**:根据表达式,我们猜测意图可能是: - 当`items.type`为0时,根据`tegsuss`的(可能是成功状态)来决定是否添加`tegfail`类(这里类名`tegfail`可能表示失败,所以逻辑上可能应该是:当`tegsuss`为false时添加`tegfail`,但这里直接用了`tegsuss`,所以可能变量名是反的?)。 - 当`items.type`不为0时,只有当`items.type`为2时,才添加`tegfail`类。 但这样的逻辑混合在一个表达式中,可读性较差,而且容易出错。 4. **重构建议**: 我们可以将逻辑提取到计算属性(computed)或方法(methods)中,这样会更清晰。例如: ```vue <template> <div :class="classObject"></div> </template> <script> export default { props: ['items'], data() { return { // 假设 tegsuss 是在data中定义的一个变量 tegsuss: false }; }, computed: { classObject() { // 根据条件返回一个对象 if (this.items.type === 0) { // 当type为0时,根据tegsuss的决定是否添加tegfail类 // 注意:这里tegfail类是否添加取决于tegsuss的,但注意变量名的含义 // 如果tegsuss为true表示成功,那么就不应该添加tegfail(失败类),所以可能是: // 当tegsuss为false时添加tegfail(失败),为true时不添加(成功) // 但原表达式是直接使用tegsuss的,所以我们保留原意:当tegsuss为真时,添加tegfail?这看起来不合理。 // 因此,这里需要根据实际业务逻辑调整。 // 假设原意:当tegsuss为true时,表示成功,那么就不需要添加tegfail(失败类),所以应该是: // 添加tegfail类当tegsuss为false(失败) // 但原表达式是:{ tegfail: ... },在type为0时,为tegsuss,所以如果tegsuss为true,就会添加tegfail类,这可能是错误逻辑。 // 所以这里需要确认业务逻辑。 // 由于我们不清楚tegsuss的具体含义,这里按照原表达式写法(即使用tegsuss的)来返回 return { tegfail: this.tegsuss }; } else { // 当type不为0时,判断type是否为2,是则添加tegfail类 return { tegfail: this.items.type === 2 }; } } } }; </script> ``` 或者,如果我们想要在模板中保持简洁,可以使用一个方法,但计算属性更合适。 5. **另一个写法(使用三元表达式修正)**: 如果我们确实想在模板中写,可以这样写: ```vue <div :class="{ tegfail: items.type === 0 ? tegsuss : items.type === 2 }"></div> ``` 这个表达式表示: - 当`items.type`等于0时,`tegfail`类是否出现由`tegsuss`(布尔)决定。 - 当`items.type`不等于0时,`tegfail`类是否出现由`items.type === 2`(布尔)决定。 这个写法在语法上是正确的,但是逻辑是否正确取决于`tegsuss`的含义和需求。 6. **注意点**: - 确保`tegsuss`是一个布尔,如果不是,需要转换。 - 当`items.type`为0时,我们使用`tegsuss`,而其他时候使用`items.type === 2`,这可能会造成逻辑上的割裂,建议检查需求是否如此。 7. **潜在的错误**:在原始表达式中,三元表达式写成了`items.type==0?tegsuss:items.type==2`,注意这里条件表达式和结果之间没有括号,但JavaScript会按照顺序解析。但是,这个表达式在语法上是正确的,只不过逻辑可能不符合预期。 8. **总结**:表达式的主要问题是可读性差且逻辑混合。建议使用计算属性将逻辑抽离,这样更易于维护和理解。 9. **性能考虑**:在模板中写复杂的表达式可能会影响性能,因为每次渲染都会重新计算。而计算属性会基于它们的依赖进行缓存,所以使用计算属性是更好的选择。 因此,我们推荐使用计算属性来重构这个动态类绑定。 [^1]: Vue.js最基本的数据绑定形式是文本插,使用"Mustache"语法(双大括号)。 [^2]: 支持简写形式 `:` ,如 `:src` 等价于 `v-bind:src`。 [^3]:Vue.js中,一个组件就是一个包含了HTML模板、JavaScript逻辑和样式的独立单元。 [^4]: 让插槽内容能够访问子组件中的数据。 §§相关问题§§ 1. Vue.js中动态类绑定的对象语法和数组语法有什么区别? 2.Vue.js中,如何根据多个条件动态绑定多个类名? 3. Vue.js的计算属性和方法在性能上有什么区别? </think> ### Vue.js动态类绑定表达式解析:`:class="{tegfail:items.type==0?tegsuss:items.type==2}"` #### 问题分析 该表达式存在三个核心问题: 1. **三元表达式误用**(主要问题) Vue的动态类绑定要求必须是布尔类型,但这里的三元表达式: `items.type==0 ? tegsuss : items.type==2` 返回的可能是: - 当 `items.type==0` 为 true 时:返回 `tegsuss`(变量,类型不确定) - 当 `items.type==0` 为 false 时:返回 `items.type==2`(布尔) **违反**了Vue动态类绑定要求必须是布尔的规则[^2] 2. **变量混淆风险** `tegsuss` 是独立变量,与 `items` 对象无关,可能导致: - 未定义错误(若 `tegsuss` 未在data/computed中声明) - 逻辑混乱(需确认 `tegsuss` 是布尔还是其他类型) 3. **逻辑不完整** 当 `items.type` 不等于0或2时(如等于1),类绑定将完全失效,可能导致UI状态缺失 --- #### 修正方案(三种推荐方式) ##### 方案1:拆分为独立布尔表达式 ```vue <div :class="{ tegfail: items.type === 0 && tegsuss, otherClass: items.type === 2 }"></div> ``` - ✅ 确保所有都是布尔类型 - ✅ 明确区分不同状态 - ⚠️ 需保证 `tegsuss` 是布尔 ##### 方案2:使用计算属性(推荐) ```vue <script> export default { computed: { classObject() { return { tegfail: this.items.type === 0 ? this.isTegsussActive : false, otherClass: this.items.type === 2 } } } } </script> <template> <div :class="classObject"></div> </template> ``` - ✅ 逻辑集中管理(最佳实践)[^3] - ✅ 支持复杂逻辑 - ✅ 自动缓存计算结果[^2] ##### 方案3:数组语法 + 方法调用 ```vue <div :class="[ items.type === 0 ? (tegsuss ? 'tegfail' : '') : '', items.type === 2 ? 'otherClass' : '' ]"></div> ``` - ✅ 显式控制类名字符串 - ⚠️ 可读性较差 --- #### 关键优化原则 1. **类型严格**:动态类绑定的必须是 `boolean` 类型[^2] 2. **逻辑隔离**:复杂逻辑应移至计算属性[^3] 3. **状态覆盖**:确保所有可能的 `items.type` 都有处理逻辑 4. **变量安全**:确保 `tegsuss` 在 `data/computed` 中声明: ```js data() { return { isTegsussActive: true // 明确布尔类型 } } ``` > 在Vue中,`v-bind:class`(或简写 `:class`)的对象语法要求每个键的必须是布尔表达式,这是Vue响应式系统高效运作的基础[^2][^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值