vue之条件渲染、列表渲染、事件处理、数据双向绑定、表单控制及购物车案例

1、条件渲染

1.1、通过v-if和v-for实现简单购物车
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<script src="js/vue.js"></script>

<div id="box">
    <h2>根据下标获取对应的水果</h2>
    <ul>
        <li>{{fruit_list[0]}}</li>
        <li>{{fruit_list[1]}}</li>
        <li>{{fruit_list[2]}}</li>
        <li>{{fruit_list[3]}}</li>
    </ul>

    <h2>通过循环遍历获取对应的水果</h2>
    <ul>
        <li v-for="data in fruit_list">{{data}}</li>
    </ul>

    <h2>根据购物车判断是否存在水果</h2>
    <ul v-if="fruit_list.length>0">
        <li v-for="data in fruit_list">{{data}}</li>    <!--如果fruit_list有值打印水果-->
    </ul>
    <div v-else>购物车空空如也</div>                      <!--如果fruit_list为空列表时打印-->
</div>

<script>
    var vm = new Vue({
        el: '#box',
        data: {
            fruit_list: ['苹果', '香蕉', '桃子', '哈密瓜'],
        },
    })
</script>

</body>
</html>
1.2、v-if、v-else-if、v-else的使用
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<script src="js/vue.js"></script>

<div id="box">
    <div v-if="number == 1">1</div>
    <div v-else-if="number == 2">2</div>     <!--在data中number为2,所以打印2-->
    <div v-else>3</div>
</div>

<script>
    var vm = new Vue({
        el: '#box',
        data: {
            number: 3,
        },
    })
</script>

</body>
</html>

2、列表渲染

2.1、for循环数组、对象
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<script src="js/vue.js"></script>

<div id="box">
    <h1>循环数组</h1>
    <div>
        <p v-for="item in arr">{{item}}</p>
    </div>

    <h1>循环对象(此处循环得到的是value,python中循环得到的是key)</h1>
    <div>
        <p v-for="item in obj">{{item}}</p>
    </div>

    <h1>循环数组的index和value</h1>
    <div>
        <p v-for="(item,index) in arr">index: {{index}}, value: {{item}}</p>
    </div>

    <h1>循环对象的key和value</h1>
    <div>
        <p v-for="(item,key) in obj">key: {{key}}, value: {{item}}</p>
    </div>
</div>

<script>
    var vm = new Vue({
        el: '#box',
        data: {
            arr: ['篮球', '足球', '羽毛球'],
            obj: {name: 'allen', age: 18, gender: 'male'},
        },
    })
</script>

</body>
</html>
2.2、key值的解释
1、v-for循环数组、对象时,建议在控件(组件,标签)写一个key属性,属性值唯一
2、页面更新以后,加速dom的替换(渲染),虚拟dom的替换diff算法
3、:key="变量"

示例: <p v-for="(item,key) in obj" :key="key(属性值唯一,正常取数据的id对应的属性值)">key: {{key}}, value: {{item}}</p>
2.3、数组更新与检测
1、数据双向绑定,数据变化页面变,页面变化数据变
2、使用以下方法操作数组,可以检测变动:push,pop,shift,unshift,splice,sort,reverse
3、不会检测变动filter(),concat(),slice(),map(),新数组替换旧数组
	页面不会更改:vm.arr.concat(['44','55'])
	解决vm.arr=vm.arr.concat(['44','55'])
4、页面不会更改:通过索引值更新数组
	解决方案一:
    vm.arr[0]
    "11"
    vm.arr[0]='99'
    "99"
    vm.arr.splice(0,1,'88')
    ["99"]
    
	解决方案二:
		Vue.set(vm.arr,0,'allen')
5、上面能更新是因为作者重写了那些方法
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<script src="js/vue.js"></script>

<div id="box">
    <ul>
        <li v-for="data in arr_list">{{data}}</li>
        <button @click="clickHandler">点击按钮把篮球换成乒乓球</button>
    </ul>
</div>

<script>
    var vm = new Vue({
        el: '#box',
        data: {
            arr_list: ['篮球', '足球', '羽毛球']
        },
        methods: {
            clickHandler() {
                this.arr_list[0] = '乒乓球';            // 这种方法只能将列表中第一个值改成乒乓球,页面中的li还是篮球
                Vue.set(vm.arr_list, 0, '乒乓球');      // 这种方法可以将页面中的li修改成乒乓球
            },
        }
    })
</script>

</body>
</html>

3、事件处理

blur:失去焦点触发
change:失去焦点触发,跟blur一样
input:数据发生变化,就会触发

3.1、input过滤案例
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<script src="js/vue.js"></script>

<div id="box">
    <h1>过滤数据</h1>
    <!--    请输入数据: <input type="text" v-model="mydata" @blur="changeHandler">-->
    请输入数据: <input type="text" v-model="mydata" @input="changeHandler">
    {{mydata}}
    <div>
        <ul>
            <li v-for="item in new_arrlist">{{item}}</li>
        </ul>
    </div>

</div>

<script>
    var vm = new Vue({
        el: '#box',
        data: {
            arr_list: ['aabbcc', 'abcdef', 'aacdee', 'bbccdd'],
            new_arrlist: ['aabbcc', 'abcdef', 'aacdee', 'bbccdd'],
            mydata: '',
        },
        methods: {
            changeHandler() {
                // 控制arr_list的变化,数据又双向绑定了,页面就会变化
                this.new_arrlist = this.arr_list.filter(item => {
                    return item.indexOf(this.mydata) > -1
                })
            },
        },
    })
</script>

</body>
</html>
3.2、简单事件
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<script src="js/vue.js"></script>

<div id="box">
    <div v-show="isShow">
        <p>数据1</p>
        <p>数据2</p>
        <p>数据3</p>
        <p>数据4</p>
        <p>数据5</p>
    </div>

    <button @click="isShow=!isShow">点击数据折叠/展开(方式一)</button>
    <button @click="clickHandler">点击数据折叠/展开(方式二)</button>
    <button @click="clickHandler($event)">点击数据折叠/展开,传递事件,方式二默认也传递事件(方式三)</button>
</div>

<script>
    var vm = new Vue({
        el: '#box',
        data: {
            isShow: true,
        },
        methods: {
            clickHandler(ev) {
                this.isShow = !this.isShow;
                console.log(ev)
            },
        },
    })
</script>

</body>
</html>
3.3、事件修饰符

.stop 阻止事件冒泡
.self 只处理自己的事件,子控件冒泡的事件不处理
.prevent 阻止a链接跳转
.once 只处理一次就解绑(抽奖页面)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<script src="js/vue.js"></script>

<div id="box">
    <ul @click.self="clickUlHandler">  <!--事件冒泡处理方式三: 给父元素添加.self就不会出现事件冒泡-->
        <li v-for="item in arr_list" @click.stop="clickLiHandler">{{item}}</li>  <!--事件冒泡处理方式二: .stop就不会出现事件冒泡-->
        <li v-for="item in arr_list" @click="clickLiHandler">{{item}}</li>
    </ul>

    <div>
        <a href="http://www.baidu.com" @click="clickHandler">点击但并不想跳转1</a>
        <a href="http://www.baidu.com" @click.prevent="clickHandler1">点击但并不想跳转2</a>  <!--方式二: 这样设置后点击标签不会跳转-->
    </div>

    <div>
        <button @click.once="clickOnceHandler">点一次事件就消失了</button>
    </div>
</div>

<script>
    var vm = new Vue({
        el: '#box',
        data: {
            arr_list: ['篮球', '足球', '羽毛球'],
        },
        methods: {
            clickUlHandler() {
                console.log('ul被点击了');
            },
            clickLiHandler(ev) {
                // ev.stopPropagation();       // 事件冒泡处理方式一: 这样设置就不会出现事件冒泡,点击事件停止向父组件传递
                console.log('li被点击了');
            },
            clickHandler(ev) {
                // ev.preventDefault();           // 方式一: 点击标签并不会跳转,阻止a标签的跳转
            },
            clickHandler1() {
                console.log('被点击了')
            },
            clickOnceHandler() {
                console.log('点一次就消失了')
            }
        },
    })
</script>

</body>
</html>
3.4、按键修饰符

敲击键盘上的按键执行某件事

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<script src="js/vue.js"></script>

<div id="box">
    敲击回车键(方式一): <input type="text" v-model="myinput" @keyup.enter="KeyHandler">
    敲击回车键(方式二): <input type="text" v-model="myinput" @keyup.13="KeyHandler">
</div>

<script>
    var vm = new Vue({
        el: '#box',
        data: {
            myinput: '',
        },
        methods: {
            KeyHandler() {
                console.log('回车键被按下了')
            },
        },
    })
</script>

</body>
</html>

4、数据双向绑定

4.1、v-model使用
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<script src="js/vue.js"></script>

<div id="box">
    <p><input type="text" v-model="myinput"></p>{{myinput}}
    <p><textarea name="" id="" cols="30" rows="10" v-model="mytextarea"></textarea></p>{{mytextarea}}
</div>

<script>
    var vm = new Vue({
        el: '#box',
        data: {
            myinput: '',
            mytextarea: '',
        },
    })
</script>

</body>
</html>

5、表单控制

5.1、checkbox选中
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<script src="js/vue.js"></script>

<div id="box">
    <h1>表单相关之checkbox</h1>
    <input type="checkbox" v-model="check">记住密码
</div>

<script>
    var vm = new Vue({
        el: '#box',
        data: {
            check: true,
        },
    })
</script>

</body>
</html>
5.2、多选
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<script src="js/vue.js"></script>

<div id="box">
    <h1>爱好</h1>
    <input type="checkbox" v-model="hobby" value="sport">运动
    <input type="checkbox" v-model="hobby" value="reading">阅读
    <input type="checkbox" v-model="hobby" value="travel">旅游
    <p>{{hobby}}</p>
</div>

<script>
    var vm = new Vue({
        el: '#box',
        data: {
            hobby: [],
        },
    })
</script>

</body>
</html>
5.3、单选
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<script src="js/vue.js"></script>

<div id="box">
    <h1>性别</h1>
    <input type="radio" v-model="gender" value=""><input type="radio" v-model="gender" value=""><input type="radio" v-model="gender" value="保密">保密
    <p>{{gender}}</p>
</div>

<script>
    var vm = new Vue({
        el: '#box',
        data: {
            gender: '',
        },
    })
</script>

</body>
</html>

6、 购物车案例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<script src="js/vue.js"></script>

<div id="box">
    <h1>购物车列表</h1>
    <input type="checkbox" v-model="selectAll" @change="CheckHandler">全选/全不选
    <ul>
        <li v-for="item in data_list">
            <input type="checkbox" v-model="my_car" :value="item" @change="handlerOne">
            {{item}}
        </li>
    </ul>
    <p>我的购物车清单: {{my_car}}</p>
    <p>价格合计: {{get_price()}}</p>
</div>

<script>
    var vm = new Vue({
        el: '#box',
        data: {
            data_list: [
                {name: '西瓜', price: 10, number: 3, id: '1'},
                {name: '苹果', price: 3, number: 4, id: '2'},
                {name: '香蕉', price: 80, number: 6, id: '3'}
            ],
            my_car: [],
            selectAll: false,
        },
        methods: {
            get_price() {
                var total_sum = 0;
                for (k in this.my_car) {
                    total_sum += this.my_car[k]['price'] * this.my_car[k]['number'];
                }
                return total_sum;
            },
            CheckHandler() {
                if (this.my_car.length > 0) {
                    this.my_car = []
                } else {
                    this.my_car = this.data_list;
                }
            },
            handlerOne() {
                if (this.my_car.length == this.data_list.length) {
                    this.selectAll = true;
                } else {
                    this.selectAll = false;
                }
            },
        }
    })
</script>

</body>
</html>
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值