Vue实现商品筛选

记得之前用原生js实现过这个案例,今天又用vue实现了一下,感觉还是vue实现起来要简单一点

直接看代码:注释上面有解释(后面有些知识点,代码后面会聊,如果会了,就可以不看哦)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>商品筛选</title>
    <style type="text/css">
        body {
            font-size: 14px;
            font-family: "Lantinghei SC Extralight",Arial;
        }
        ul {
            padding: 0;
            margin: 0;
            list-style: none;
        }
        a {
            text-decoration: none;
        }
        img {
            vertical-align: top;
        }
        #wrap {
            width: 760px;
            height: 260px;
            margin: 100px auto;
            padding: 145px 120px 95px;
            background: url(img/bg.jpg) no-repeat 0 0;
        }
        #section {
            width: 760px;
            height: 260px;
            -webkit-box-shadow: 0px 0px 4px rgba(0,0,0,.2);
            box-shadow: 0px 0px 4px rgba(0,0,0,.2);
        }
        #choose {
            width: 760px;
            height: 50px;
            margin: 0 auto;
            background: url(img/nav_bg.png) no-repeat 0 0;
            line-height: 50px;
            text-indent: 21px;
        }
        #type {
            width: 100%;
            height: 210px;
            background: url(img/type_bg.png) no-repeat 0 0;
            padding: 17px 0 16px 28px;
        }
        #type li {
            height: 44px;
            color: #8a8a8a;
            line-height: 44px;
        }
        #type a {
            margin: 0 12px 0 11px;
            color: #000;
        }
        #choose mark {
            position: relative;
            display: inline-block;
            height: 24px;
            line-height: 24px;
            border: 1px solid #28a5c4;
            color: #28a5c4;
            margin: 12px 5px 0;
            background: none;
            padding: 0 30px 0 6px;
            text-indent: 0;
        }
        #choose mark a {
            position: absolute;
            top: 3px;
            right: 2px;
            display: inline-block;
            width: 18px;
            height: 18px;
            background: #28a5c4;
            color: #fff;
            line-height: 18px;
            font-size: 16px;
            text-align: center;
        }
        .active {
            background: rgb(40, 165, 196);
        }
    </style>
    <script src="../src/vue.js"></script>
    <script type="text/javascript">
        let data = [
            {
                title: '品牌',
                list: ["苹果", "小米", "锤子", "魅族", "华为", "三星", "OPPO", "vivo", "乐视", "360", "中兴", "索尼"]
            },
            {
                title: '尺寸',
                list: ["3.0英寸以下", "3.0-3.9英寸", "4.0-4.5英寸", "4.6-4.9英寸", "5.0-5.5英寸", "6.0英寸以上"]
            },
            {
                title: '系统',
                list: ["安卓", "(", "Android", ")", "苹果", "(", "IOS", ")", "微软", "(", "WindowsPhone", ")", "无", "其他"]
            },
            {
                title: '网络',
                list: ["联通3G", "双卡单4G", "双卡双4G", "联通4G", "电信4G", "移动4G"]
            }
        ]
    </script>
</head>
<body>
<div id="wrap">
    <section id="section">
        <nav id="choose">
            你的选择:
            <!-- <mark>锤子<a href="javascript:;">x</a></mark> -->
             <mark
                     v-for="item,key in choose"
                     @click="delFn(key)"
             >
                 {{item}}
                 <a href="javascript:;"
                 >x</a>
             </mark>
        </nav>
        <ul id="type">
            <li
                    v-for="item,i in dataList"
            >
                {{item.title}}:
                <a
                        v-for="value,j in item.list"
                        href="javascript:;"
                        v-bind:class="{active:item.index===j}"
                        @click="showFn(value,i,j)"
                >
                    {{value}}
                </a>
            </li>
        </ul>

    </section>
</div>
<script>
    // 需要处理data
    data.forEach(item=>item.index = -1);
    var vm = new Vue({
        el:"#wrap",
        data:{
            dataList:data,
            choose:{}
        },
        methods:{
            showFn(val,i,j){
                //下面这种方法给对象添加属性并不会响应
                // this.choose[i] = val
                this.$set(this.choose,i,val)
                //找到操作的一行,把这一行的数据中的index设置为点击的标签的下标
                this.dataList[i].index = j;
            },
            delFn(key){
                /*
                删除对象中的属性
                 */
                this.$delete(this.choose,key);
                this.dataList[key].index = -1;
            }
        }
    });
</script>
</body>
</html>

知识点补充:

为Vue中的对象动态添加属性的方法:根据官方文档定义:如果在实例创建之后添加新的属性到实例上,它不会触发视图更新。

如果我们想要为choose添加一个新的属性name,像vm.choose.name = "leo";这种写法是不能够更新视图的

在上面的小例子中我们想要为choose对象添加属性,我们采用的方法是$.set()的方法,那下面我们就聊聊为对象动态添加属性的三种方法。

1、Vue.set(target,prop,value);//调用vue的静态方法

  • 设置对象的属性,如果对象是响应的,确保属性被创建后也是响应式的,同时触发视图更新。这个方法主要用于避开Vue不能检测属性被添加的限制

2、vm.$set(target,prop,value);//调用实例上的方法$set

3、vm.choose = Object.assign({},vm.choose,{name:"donna"});//替换对象。

使用这种方法需要注意,第一个空对象是不能够少的,因为Object.assign中的第一个对象就是它的返回值,如果我们设置第一个对象为vm.choose,那么其实就相当于直接给choose对象添加属性,这样视图是不会更新的。

var o = Object.assign(vm.choose,{name:"donna"});
console.log(vm.choose=== o);//true
o这个返回值就是vm.choose这个对象


猜你喜欢

转载自blog.csdn.net/lhjuejiang/article/details/80983098