vue学习(1)

目录

基本使用

理解Vue的MVVM

模板语法

计算属性

监视属性

计算属性的set()与get()

class与style绑定

条件渲染

列表渲染

数组更新检测

列表的搜索与排序


基本使用

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div id="app">
        <input type="text" v-model="username">
        <p>Hello,{{username}}</p>
    </div>
</body>
    <script src="JS/vue.js"></script>
    <script>
        var vm=new Vue({
            el: '#app',
            data: {
                username: 'gg'
            }
        });
    </script>
</html>
  • 引入vue.js
  • 创建vue对象

el:指定根element(选择器)

data:初始化数据(页面可以访问)

  • 双向数据绑定:v-model
  • 显示数据:{{xxx}}

理解Vue的MVVM

MVVM:第一个m表示model,第一个v表示view,后面vm表示viewmodel

model:模型,数据对象(data)

view:视图,模板页面

viewmodel:视图模型(本质上是view的实例)


模板语法

模板的理解:动态的html页面,包含了一些js代码,双大括号表达式,指令(都以v-开头的自定义标签属性)

  • 双大括号表达式

语法:{{exp}}        功能:向页面输出数据

可以调用对象的方法

  • 强制数据绑定

功能:指定变化的属性值

完整写法:v-bind:xxx='yyy'        //yyy会作为表达式解析执行

简洁写法::xxx='yyy'

<body>
    <div id="app">
        <input type="text" v-model="username">
        <p>Hello,{{username}}</p>
        <img v-bind:src="img1" width="200px">
    </div>
</body>
    <script src="JS/vue.js"></script>
    <script>
        var vm=new Vue({
            el: '#app',
            data: {
                username: 'gg',
                img1: 'https://cn.vuejs.org/images/logo.svg'
            }
        });
    </script>
  • 绑定事件监听

功能:绑定指定事件名的回调函数

完整写法:v-on:click='xxx'

简洁写法:@click='xxx'

回调函数可带参

<body>
    <div id="app">
        <input type="text" v-model="username">
        <p>Hello,{{username}}</p>
        <button v-on:click="test">button</button>
    </div>
</body>
    <script src="JS/vue.js"></script>
    <script>
        var vm=new Vue({
            el: '#app',
            data: {
                username: 'gg',
            },
            methods: {
                test(){
                    alert("gg");
                }   
            }
        });
    </script>

计算属性

computed属性对象中定义计算属性的方法,在页面中使用{{方法名}}来显示计算的结果。

初始化显示或相关的data属性数据发生改变,计算并返回当前属性值。

计算属性存在缓存,多次读取只执行一次get()计算

<body>
    <div id="app">
        <input type="text" v-model="username">
        <p>Hello,{{name}}</p>
    </div>
</body>
    <script src="JS/vue.js"></script>
    <script>
        var vm=new Vue({
            el: '#app',
            data: {
                username: 'gg'
            },
            computed:{
                name(){
                    return this.username+'gg';    //这里的this指的是vm对象
                }
            }
        });
    </script>

监视属性

通过vm对象的$watch()watch配置来监视指定的属性。当属性变化时,回调函数自动调用,在函数内部进行计算

<body>
    <div id="app">
        <input type="text" v-model="username">
        <p>Hello,{{name}}</p>
    </div>
</body>
    <script src="JS/vue.js"></script>
    <script>
        var vm=new Vue({
            el: '#app',
            data: {
                username: 'gg'
            },
            //监视属性
            watch:{
                username:function(val){
                    this.name=val+'!'; 
                }
            }
        });
        //对象的方法(对象的属性和方法前面都会加上'$'
        vm.$watch('username',function(){
            alert('gg');
        })
    </script>

计算属性的set()与get()

get():回调函数,当需要读取当前属性值时回调,根据相关的数据计算并返回当前属性值

set():回调函数,监视当前属性值的变化。当属性值发生改变时回调,更新相关的属性值

<body>
    <div id="app">
        姓<input type="text" v-model="first"> <br>
        名<input type="text" v-model="last"> <br>
        姓名<input type="text" v-model="full">
    </div>
</body>
    <script src="JS/vue.js"></script>
    <script>
        var vm=new Vue({
            el: '#app',
            data: {
                first:'g',
                last:'g'
            },
        computed:{
            full:{
                get(){
                    return this.first+' '+this.last;
                },
                set(val){
                    var name=val.split(' ');
                    this.first=name[0];
                    this.last=name[1];
                }
            }
        }
        });
    </script>

class与style绑定

class绑定::class='xxx'

xxx可以是字符串、对象、数组

style绑定::style="{color: activeColor , fontSize: font_Size + 'px'}"

其中activeColorfont_Size是data属性

    <style>
        .aclass{
            color: red;
        }
        .bclass{
            color:green;
        }
        .cclass{
            font-size: 30px;
        }
    </style>
</head>
<body>
    <div id="app">
        <p :class="a">xxx是字符串</p>
        <p :class="{aclass:isa,bclass:isb}">xxx是对象</p>
        <button @click="fun1">button</button>
    </div>
</body>
    <script src="JS/vue.js"></script>
    <script>
        new Vue({
            el:'#app',
            data:{
                a:'aclass',
                isa:true,
                isb:false
            },
            methods: {
                fun1(){
                    this.a='cclass';
                    this.isa='false';
                    this.isb='true';
                }
            },
        });
    </script>

条件渲染

条件渲染指令:

v-if        v-else        v-show

<body>
    <div id="app">
        <p v-if="ok">成功</p>
        <p v-else>失败</p>
        <p v-show="ok">show成功</p>
        <p v-show="!ok">show失败</p>
        <button @click="ok=!ok">button</button>
    </div>
</body>
<script src="JS/vue.js"></script>
<script>
    new Vue({
        el:'#app',
        data:{
            ok:false
        }
    });
</script>

列表渲染

列表显示

数组:v-for / index

对象:v-for / key

数组更新检测

vue本身只是监视了persons的改变,没有监视数组内部数据的改变

vue包含一组观察数组的变异方法,所以它们也将会触发视图更新,这些方法如下:

push()        pop()        shift()        unshift()        splice()        sort()        reverse()

<body>
    <div id="app">
        <h2>v-for遍历数组</h2>
        <ul>
            <li v-for="(item, index) in persons" :key="index">
                {{index}}---{{item.name}}---{{item.age}}
                <button @click="del(index)">删除</button>
                <button @click="update(index,{name:'1',age:1})">更新</button>
            </li>
        </ul>
        <h2>v-for遍历对象</h2>
        <ul>
            <li v-for="(value, key) in persons[1]" :key="key">
                {{key}}---{{value}}
            </li>
        </ul>
    </div>
</body>
<script src="JS/vue.js"></script>
<script>
    new Vue({
        el:'#app',
        data:{
            persons:[   //vue本身只是监视了persons的改变,没有监视数组内部数据的改变
                {name:'Tom',age:18},
                {name:'Bob',age:16},
                {name:'Mike',age:15}
            ]
        },
        methods:{
            del(index){
                this.persons.splice(index,1);
            },
            update(index,newP){
                //并没有改变persons本身,数组内部发生了变化,但并没有调用变异方法,vue不会更新界面
                //this.persons[index]=newP;
                this.persons.splice(index,1,newP);
            }
        },
    });
</script>

列表的搜索与排序

<body>
    <div id="app">
        <input type="text" v-model="searchName">
        <ul>
            <li v-for="(item, index) in filterPersons" :key="index">
                {{index}}---{{item.name}}---{{item.age}}
            </li>
        </ul>
        <button @click="setOrder(1)">年龄升序</button>
        <button @click="setOrder(2)">年龄降序</button>
        <button @click="setOrder(0)">原本顺序</button>       
    </div>
</body>
<script src="JS/vue.js"></script>
<script>
    new Vue({
        el:'#app',
        data:{
            searchName:'',
            order:0,    //0表示原本,1表示升序,2表示降序
            persons:[
                {name:'Tom',age:18},
                {name:'Bob',age:15},
                {name:'Mike',age:16}
            ]
        },
        computed:{
            filterPersons(){
                //取出相关的数据
                const {searchName,persons,order}=this;
                //最终需要显示的数据
                var fPersons;
                fPersons=persons.filter(item=>item.name.indexOf(searchName)>=0);

                if(order!=0){
                    fPersons.sort(function(p1,p2){//sort函数:如果返回负数,p1在前;返回正数,p2在前
                        if(order==2)
                            return p2.age-p1.age;
                        else
                            return p1.age-p2.age;
                    })
                }
                return fPersons;
            }
        },
        methods:{
            setOrder(val){
                this.order=val;
            }
        },
    });
</script>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值