vue——基础

一、条件渲染

1.1 通过v-if和v-for实现购物车

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <script src="./js/vue.js"></script>
    <style>
        .red {
            background: red;
        }

        .green {
            background: green;
        }

        .font {
            font-size: 30px;
        }

    </style>
    <title>Title</title>
</head>
<body>

<div id="box">

    <!--    土办法-->
    <!--    <ul>-->
    <!--        <li>{{shopping[0]}}</li>-->
    <!--        <li>{{shopping[1]}}</li>-->
    <!--        <li>{{shopping[2]}}</li>-->
    <!--    </ul>-->

    <!--v-for实现-->
    <ul v-if="shopping.length>0">
        <li v-for="data in shopping">{{data}}</li>
    </ul>
    <div v-else>购物车空空如也</div>
</div>

</body>
<script>
    var vm = new Vue({
        el: '#box',
        data: {
            shopping: ['苹果', '香蕉', '桃子'],
        },

    })
</script>
</html>

 

1.2 v-if/v-else-if/v-else

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <script src="./js/vue.js"></script>
    <style>

    </style>
    <title>Title</title>
</head>
<body>

<div id="box">
    <div v-if="which==1">1111</div>
    <div v-else-if="which==2">2222</div>
    <div v-else>3333</div>

</div>

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

 二、列表渲染

2.1 for循环数组,对象

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <script src="./js/vue.js"></script>
    <style>

    </style>
    <title>Title</title>
</head>
<body>

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


    <h1>循环对象</h1>
    <div>
        <p v-for="data in obj">{{data}}</p>
    </div>

    <h1>循环数组索引和value</h1>
    <div>
        <p v-for="(data,index) in arr">索引是:{{index}},数据是{{data}}</p>
    </div>
    <h1>循环对象key和value</h1>
    <div>
        <p v-for="(value,key) in obj">key是:{{key}},value是:{{value}}</p>
    </div>

</div>

</body>
<script>
    var vm = new Vue({
        el: '#box',
        data: {
            arr: ['zs', 'ls', 'ww'],
            obj: {name: 'lqz', age: 18, sex: ''},
        },

    })
</script>
</html>

注意!在Vue中:

数组的index和value是反的
对象的key和value也是反的

2.2 key值的解释

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

2.3 数组更新与检测

0 数据双向绑定,数据变化,页面变,页面变化数据变
1 使用以下方法操作数组,可以检测变动:
    push #最后位置添加
    pop #最后位置删除
    shift #第一个位置删除
    unshift #第一个位置添加
    splice #切片
    sort #排序
    reverse #反转
2 不会检测变动(用新数组替换旧数组)
    filter() #过滤
    concat() #追加另一个数组
    slice() #选取 
    map() #映射
    -页面不会更改:vm.arr.concat(['44','55'])
    -解决vm.arr=vm.arr.concat(['44','55'])


3 页面不会更改解决方法 :通过索引值更新数组
    -解决方案一:
    vm.arr[0]
    "11"
    vm.arr[0]='99'
    "99"
    vm.arr.splice(0,1,'88')
    ["99"]
    -解决方案二
    Vue.set(vm.arr,0,'lqz')

4 上面能更新是因为作者重写了那些方法(只重写了一部分方法,但是还有另一部分没有重写)

三、事件处理

input #当输入框进行输入的时候 触发的事件

change #当元素的值发生改变时 触发的事件

blur #当输入框失去焦点的时候 触发的事件

change 和 blur 最本质的区别:

如果输入框为空,失去焦点后,change不会触发,但是blur会触发

3.1 input过滤案例

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <script src="js/vue.js"></script>
    <title>input过滤案例</title>
</head>
<body>
<div id="box">
<!--    <input type="text" v-model="myinput" @blur="handleChange"> {{myinput}}-->
<!--    <input type="text" v-model="myinput" @change="handleChange"> {{myinput}}-->
    <input type="text" v-model="myinput" @input="handleChange"> {{myinput}}
    <div>
        <p v-for="data in new_arr">{{data}}</p>
    </div>

</div>
</body>
<script>
    var vm = new Vue({
        el: '#box',
        data: {
            myinput: '',
            arr: ['aabbc', 'abc', 'aabcd', 'ccdd', 'bbcc'],
            new_arr: ['aabbc', 'abc', 'aabcd', 'ccdd', 'bbcc'],
        },
        methods: {
            handleChange() {
                console.log(this.myinput)
                this.new_arr = this.arr.filter(item => {
                    return item.indexOf(this.myinput) > -1
                })
            }
        }
    })
    // 土办法
    // var a=['aabbc', 'abc', 'aabcd','ccdd','bbcc']
    // var res=a.filter(function (itme) {
    //     // if (itme.length >4){
    //     //     return true
    //     // }else {
    //     //     return false
    //     // }
    //     // if (itme.indexOf('aa')>-1){
    //     //     return true
    //     // }else {
    //     //     return false
    //     // }
    //     return itme.indexOf('a')>-1
    //
    // })
    //
    //
    // var res=a.filter(item=>{
    //     return itme.indexOf('a')>-1
    // })
    // console.log(res)
    //
    //
    // var a=function (a) {
    // }
    //
    // var a=a=>{}
</script>

</html>

3.2 简单事件

简单事件:折叠/展开/传递event事件
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <script src="js/vue.js"></script>
    <title>简单事件</title>
</head>
<body>
<div id="box">
    //方式不同,效果一致
    <button @click="isShow=!isShow">点我折叠/展开1</button>
    <br>
    <button @click="handleClick">点我折叠/展开2</button>
    <br>
    <button @click="handleClick($event)">点我折叠/展开3,传递event事件</button>
    <br>
    <button @click="handleClick">点我折叠/展开4,传递event事件</button>
    <div v-show="isShow">
        第一行
        <br>
        第二行
        <br>
        第三行


    </div>
</div>

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

 

3.3 事件修饰符

.stop 只处理自己的事件,父控件冒泡的事件不处理(阻止事件冒泡)
.self 只处理自己的事件,子控件冒泡的事件不处理

.prevent 阻止a链接跳转
.once 事件只处理一次就解绑(抽奖页面)

使用修饰符时,顺序很重要;相应的代码会以同样的顺序产生

  • 用 v-on:click.prevent.self 会阻止所有的点击
  • 而 v-on:click.self.prevent 只会阻止对元素自身的点击

代码演示

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <script src="js/vue.js"></script>
    <title>事件修饰符</title>
</head>
<body>
<div id="box">
    <!--方式三  .self-->
    <ul @click.self="handleUl">
        <!--        方式一(这种方式加不加$event都可以,但方法里必须加)-->
        <!--        <li v-for="data in datalist" @click="handleLi">{{data}}</li>-->
        <!--        <li v-for="data in datalist" @click="handleLi($event)">{{data}}</li>-->
        <!--        方式二 .stop-->
        <li v-for="data in datalist" @click.stop="handleLi">{{data}}</li>
  <!--  .once只处理一次-->
        <li v-for="data in datalist" @click.once="handleLi">{{data}}</li>
    </ul>
<!--    阻止a链接跳转-->
    <a href="http://www.baidu.com" @click.prevent="handleA">阻止a标签的跳转</a>


</div>

</body>
<script>
    var vm = new Vue({
        el: '#box',
        data: {
            datalist: ['aaa', 'bbb', 'ccc']
        },
        methods: {
            //方式一
            // handleLi(ev) {
            //     console.log('li被点击了')
            //     ev.stopPropagation() //点击事件停止向父组件传递
            // },
            //方式二
            handleLi() {
                console.log('li被点击了')
            },
            //方式三
            handleUl() {
                console.log('ul被点击了')
            },
            //阻止a标签跳转
            // handleA(ev){
            //     console.log('a被点击了')
            //     ev.preventDefault() //阻止a标签的跳转
            // }
            handleA() {
                console.log('a被点击了')
            },
        }
    })
</script>
</html>

3.4 按键修饰符

敲击回车键干的事情

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <script src="js/vue.js"></script>
    <title>按键修饰符</title>
</head>
<body>
<div id="box">
<!--    方式一:用event事件(麻烦,不推荐)-->
<!--    <input type="text" v-model="myinput" @keyup="handleKey">-->
<!--    方式二:.enter或.13 因为每个按键都有它对应的数字,用数字也可以-->
<!--    <input type="text" v-model="myinput" @keyup.enter="handleKey">-->
        <input type="text" v-model="myinput" @keyup.13="handleKey">

</div>

</body>
<script>
    var vm = new Vue({
        el: '#box',
        data: {
            myinput: ''
        },
        methods: {
            //方式一
            // handleKey(ev){
            //     console.log('xxx')
            //     console.log(ev)
            //     if(ev.keyCode==13){
            //         console.log('回车被按下了')
            //     }
            // },
            //方式二
            handleKey() {
                console.log('回车被按下了')
            }
        }

    })

</script>
</html>

 四、数据双向绑定

4.1 v-model使用

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <script src="js/vue.js"></script>
    <title>Document</title>
</head>
<body>
<div id="box">
    <input type="text" v-model="myinput">
    <br>
    {{myinput}}
    <br>
    <textarea name="" id="" cols="30" rows="10" v-model="text"></textarea>
    <br>
    {{text}}
    <hr>
    <h1>表单相关之checkbox</h1>
    <input type="checkbox" v-model="check">记住密码
    <br>
    {{check}}
    <h1>表单相关之radio</h1>
    <input type="radio" v-model="ra" value="1"><input type="radio" v-model="ra" value="2"><input type="radio" v-model="ra" value="0">未知
    <br>
    {{ra}}
    <h1>表单相关之checkbox多选</h1>
    <h3>笑的表现</h3>
    <input type="checkbox" v-model="checkgroup" value="hehe">呵呵
    <input type="checkbox" v-model="checkgroup" value="xixi">嘻嘻
    <input type="checkbox" v-model="checkgroup" value="haha">哈哈
    <br>
    {{checkgroup}}
</div>

</body>
<script>
    var vm = new Vue({
        el: '#box',
        data: {
            myinput: '',
            text: '',
            check: true,
            ra: '',
            checkgroup: [],
        },
    })
</script>
</html>

 

5.4 v-model之lazy,number,trim 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <script src="js/vue.js"></script>
    <title>Title</title>
</head>
<body>

<div id="box">
<!--    光标移出input框时显示内容,不用写一个显示一个字内容(减少交互,用于优化)-->
    <input type="text" v-model.lazy="mytext">||{{mytext}}
    <br>
<!--    只显示数字type="number"只能输入数字 推荐,type="text"当输入以数字开头时,只显示数字,麻烦不推荐-->
    <input type="number" v-model.number="mynumber">||{{mynumber}}
<!--    <input type="text" v-model.number="mynumber"> ||{{mynumber}}-->
    <br>

<!--    清除前后的空格-->
    <input type="text" v-model.trim="mytrim">||{{mytrim}}||

</div>

</body>
<script>
    var vm = new Vue({
        el: '#box',
        data: {
           mytext:'',
           mynumber:'',
           mytrim:'',
        },
    })
</script>
</html>

5.5 购物车案例之结算

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <script src="js/vue.js"></script>
    <title>购物车结算</title>
</head>
<body>

<div id="box">


    <ul>
        <!--<li v-for="item in datalist">商品名字:{{item.name}},商品数量:{{item.number}}</li>-->
        <li v-for="item in datalist">
            <input type="checkbox" :value="item" v-model="checkgroup">
            {{item}}
        </li>
    </ul>
    <br>
    当前价格是:{{getPrice()}}
    <br>
    {{checkgroup}}
</div>

</body>
<script>
    var vm = new Vue({
        el: '#box',
        data: {
            datalist: [
                {name: '橘子', price: 5, number: 1, id: '1'},
                {name: '苹果', price: 3, number: 4, id: '2'},
                {name: '香蕉', price: 8, number: 6, id: '3'}
            ],
            checkgroup: [],

        },
        methods:{
            getPrice(){
                var sum_price=0
                for(i in this.checkgroup){
                    sum_price+=this.checkgroup[i]['number']*this.checkgroup[i]['price']
                }
                return sum_price
            }
        }
    })

</script>
</html>

5.6 购物车案例之全选/全不选

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <script src="js/vue.js"></script>
    <title>购物车全选/全不选</title>
</head>
<body>

<div id="box">

    <input type="checkbox" v-model="isAll" @change="handleCheck"> 全选/全不选
    <ul>
        <!--<li v-for="item in datalist">商品名字:{{item.name}},商品数量:{{item.number}}</li>-->
        <li v-for="item in datalist">
            <input type="checkbox" :value="item" v-model="checkgroup" @change="handleOne">
            {{item}}
        </li>
    </ul>
    <br>
    当前价格是:{{getPrice()}}
    <br>
    {{checkgroup}}
</div>

</body>
<script>
    var vm = new Vue({
        el: '#box',
        data: {
            datalist: [
                {name: '橘子', price: 5, number: 1, id: '1'},
                {name: '苹果', price: 3, number: 4, id: '2'},
                {name: '香蕉', price: 8, number: 6, id: '3'}
            ],
            checkgroup: [],
            isAll:false,

        },
        methods:{
            getPrice(){
                var sum_price=0
                for(i in this.checkgroup){
                    sum_price+=this.checkgroup[i]['number']*this.checkgroup[i]['price']
                }
                return sum_price

            },
            handleCheck(){
                // console.log('xxx')
                if(this.checkgroup.length>0){
                    this.checkgroup=[]
                }else {
                    this.checkgroup=this.datalist
                }

            },
            handleOne(){
                console.log('选中',this.checkgroup.length)
                console.log('总数据',this.datalist.length)

                if(this.checkgroup.length==this.datalist.length){
                    this.isAll=true
                }else {
                    this.isAll=false
                }
            }
        }
    })

</script>
</html>

5.7 购物车案例之数量加/减

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <script src="js/vue.js"></script>
    <title>Title</title>
</head>
<body>

<div id="box">

    <input type="checkbox" v-model="isAll" @change="handleCheck"> 全选/全不选

    <div></div>
    <ul>
        <!--<li v-for="item in datalist">商品名字:{{item.name}},商品数量:{{item.number}}</li>-->
        <li v-for="item in datalist">
            <input type="checkbox" :value="item" v-model="checkgroup" @change="handleOne">
            {{item}}
            <button @click="item.number++"></button>
            {{item.number}}
            <button @click="handleJ(item)"></button>
        </li>
    </ul>
    <br>
    当前价格是:{{getPrice()}}
    <br>
    {{checkgroup}}
</div>

</body>
<script>
    var vm = new Vue({
        el: '#box',
        data: {
            datalist: [
                {name: '橘子', price: 5, number: 1, id: '1'},
                {name: '苹果', price: 3, number: 4, id: '2'},
                {name: '香蕉', price: 8, number: 6, id: '3'}
            ],
            checkgroup: [],
            isAll:false,

        },
        methods:{
            getPrice(){
                var sum_price=0
                for(i in this.checkgroup){
                    sum_price+=this.checkgroup[i]['number']*this.checkgroup[i]['price']
                }
                return sum_price

            },
            handleCheck(){
                // console.log('xxx')
                if(this.checkgroup.length>0){
                    this.checkgroup=[]
                }else {
                    this.checkgroup=this.datalist
                }

            },
            handleOne(){
                console.log('选中',this.checkgroup.length)
                console.log('总数据',this.datalist.length)

                if(this.checkgroup.length==this.datalist.length){
                    this.isAll=true
                }else {
                    this.isAll=false
                }
            },
            handleJ(item){
                if(item.number<=1){
                    alert('不能再少了')
                    item.number=1
                }else {
                    item.number--
                }

            }
        }
    })

</script>

</html>

原文地址:https://www.cnblogs.com/guojieying/p/14141134.html