Vue模板语法(上)

一、文本

1、vue对象显示:{{}}

  • 在html中通过{{}}(双大括号)中可以把Vue对象中的数据插入到网页中。并且只要Vue对象上对应的值发生改变了,那么html中双大括号中的值也会立马改变。
<div id="app">
    <p>{{username}}</p>
    <!--改变一次就改不回来了-->
    <button v-on:click="change">点击修改</button>
</div>
<script>
    let vm = new Vue({
        el: "#app",
        data: {
            "username": "老萝卜"
        },
        methods: {
            change: function(){
                this.username = 'China';
            }
        }
    });
</script>

-当然,如果在html的{{}}中,第一次渲染完成后,不想要跟着后期数据的更改而更改,那么可以使用v-once指令来实现。

<p v-once>{{username}}</p>

在这里插入图片描述

  • 改为乒乓值,需要用到条件判断
<div id="app">
        <!--来回切换,到底是谁?-->
        <p>{{username}}</p>
        <!--改变一次就改不回来了-->
        <p  v-once>{{age}}</p>
        <!--实际age的值-->
        <p>"age="{{age}}</p>
        <button v-on:click="change">点击修改</button>
    </div>
    <script>
        let vm = new Vue({
            el: "#app",
            data: {
                "username": "老萝卜",
                age:"永远是17岁的花季"
            },
            methods: {
                change: function(){
                    if (this.username=="老萝卜"){
                        this.username = 'China';
                    }else{
                        this.username = '老萝卜';
                    }
                    this.age=80
                }
            }
        });
    </script>

在这里插入图片描述

2、事件方法绑定:v-on: 或 @

  • 上面例子中,点击事件绑定 vue中定义的一个方法
    在这里插入图片描述

3、显示原生的HTML:v-html=

  • 有时候我们的Vue对象中,或者是后台返回给我们一个段原生的html代码,我们需要渲染出来,那么如果直接通过{{}}渲染,会把这个html代码当做字符串。这时候我们就可以通过v-html指令来实现
<div id="app">
        <a href="https://www.baidu.com">百度一下,你就知道了</a>
        <p>{{username}}</p>
        <p>{{code}}</p>
        <p v-html='code'></p>
    </div>
    <script>
        let vm = new Vue({
            el: "#app",
            data: {
                username: "老萝卜",
                code:'<a href="https://www.baidu.com">百度一下,你就知道了</a>'
            }            
        });
    </script>

在这里插入图片描述

4、属性绑定 : v-bind:

  • 如果我们想要在html元素的属性上绑定我们Vue对象中的变量,那么需要通过v-bind来实现
<div id="app">
        <img v-bind:src="imgSrc" alt="2020年共和国授勋仪式">

        <p></p>

        <!--未绑定-->
        <img class="{{classname}}">你好,世界</p>
    </div>
    <script>
        let vm = new Vue({
            el: "#app",
            data: {
                "classname": "pclass",
                "imgSrc": "https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=68439082,600649479&fm=26&gp=0.jpg"
            }
        });
    </script>

在这里插入图片描述

4.1 绑定Class属性

4.1.1 通过参数方式实现(只能绑定一个)

-如 你好,世界

4.1.2 通过数组的方式来实现(绑定多个属性值)
 <div id="app">
        <p v-bind:class="[classname1,classname2]">你好,世界</p>
        <p :class=classname3>老萝卜</p>
    </div>
    <script>
        let vm = new Vue({
            el: "#app",
            data: {
                classname1: "pcolor",
                classname2: "pfont",
                classname3: "pcolor1"
            }
        });
    </script>

在这里插入图片描述

4.1.3 通过对象的方式来实现(通过value值True 或False,来控制是否生效)
<div id="app">
        <p v-bind:class="{pcolor:iscolor,pclass:isfont}">你好,世界</p>
        <p :class=classname3>老萝卜</p>
    </div>
    <script>
        let vm = new Vue({
            el: "#app",
            data: {
                iscolor:true,
                isfont:true,
                classname3: "pcolor1"
            }
        });
    </script>

在这里插入图片描述

4.2 绑定style

5、使用JavaScript表达式

  • 在使用了v-bind的html属性,或者使用了{{}}的文本。我们还可以执行一个JavaScript表达式
<div id="app">
        <p>{{username}}</p>
        <!-- 三元表式确定style, 对username进行分解、倒序、再组合-->>
        <p v-bind:style="{color:color?'red':'blue'}">{{username.split(" ").reverse().join(" ")}}</p>
      </div>
      <script>
          let vm = new Vue({
              el: "#app",
              data: {
                  username: "hello world",
                  color: true
              }
          });
      </script>

在这里插入图片描述

  • 注意,只能是JavaScript表达式,不能是语句,比如var a=1;a=2;这样的是js语句,不是表达式了

二、条件判断

1、条件判断: v-if、v-else-if 及v-else 组合

  • 在模板中,可以根据条件进行渲染。条件用到的是v-if、v-else-if以及v-else来组合实现的

1.1 在一个条件中加载一个html元素

<div id="app">
        <p v-if="weather == 'sun'">今天去公园玩!</p>
        <p v-else-if="weather == 'rain'">今天去看电影!</p>
        <p v-else>今天哪儿也不去!</p>
        <button v-on:click=change_weather_sun>今天晴天</button>
        <button v-on:click=change_weather_rain>今天下雨</button>
        <button v-on:click=change_weather_windy>今天大风</button>
    </div>
    <script>
        let vm = new Vue({
            el: "#app",
            data: {
                weather: 'sun'
            },
            methods:{
                // 类似python中def hello_vue
                change_weather_sun:function(){
                    this.weather= 'sun'
                },
                change_weather_rain:function(){
                    this.weather= 'rain'
                },
                change_weather_windy:function(){
                    this.weather= 'windy'
                }
            }
        });
    </script>

在这里插入图片描述

1.2在一个条件中加载多个html元素

  • 在父标签中进行判断,子标签随父标签加载
<div id="app">
        <template v-if="age<18">
            <p>数学多少分?</p>
            <p>英语多少分?</p>
        </template>
        <template v-else-if="age>=18 && age<25">
            <p>女朋友找到了吗?</p>
            <p>考研究生了吗?</p>
        </template>
        <template v-else>
            <p>二胎生了吗?</p>
            <p>工资多少?</p>
        </template>
        <button v-on:click="age18">我未成年</button>
        <button v-on:click="age25">我没到25呢</button>
        <button v-on:click="age35">我好想一直年青</button>
    </div>
    <script>
        let vm = new Vue({
            el: "#app",
            data: {
                age: 24
            },
            methods:{
                age18:function(){
                    this.age=17
                },
                age25:function(){
                    this.age=24
                },
                age35:function(){
                    this.age=35
                }
            }
        });
    </script>
1.2.1 不同的登录方式之间切换
<div id="app">
    <template v-if="loginType=='username'">
        <label for="username">用户名:</label>
        <input type="text" id="username" name="username" placeholder="用户名">
    </template>
    <template v-else-if="loginType=='email'">
        <label for="email">邮箱:</label>
        <input type="text" id="email" name="email" placeholder="邮箱">
    </template>
    <div>
        <button v-on:click="changeLoginType">切换登录类型</button>
    </div>
</div>
<script>
    let vm = new Vue({
        el: "#app",
        data: {
            loginType: "username"
        },
        methods: {
            changeLoginType: function(event){
                this.loginType = this.loginType=="username"?"email":"username";
            }
        }
    });
</script>
1.2.2 切换后清空输入框的值:在需要重新渲染的元素上加上唯一的key属性
<div id="app">
        <div  v-if="loginType=='username'">
            <label for="username">用户名:</label>
            <input type="text" id="username" name="username" placeholder="用户名" key="username">
        </div>
        <div v-else-if="loginType=='email'">
            <label for="email">邮箱:</label>
            <input type="text" id="email" name="email" placeholder="邮箱" key="email">
        </div>
        <div>
            <button v-on:click="changeLoginType">切换登录类型</button>
        </div>
    </div>
    <script>
        let vm = new Vue({
            el: "#app",
            data: {
                loginType: "username"
            },
            methods: {
                changeLoginType: function(event){
                    this.loginType = this.loginType=="username"?"email":"username";
                }
            }
        });
    </script>

2、条件判断 : v-show

3、v-show 和v-if 的区别

  • 一般来说, v-if有更高的切换开销,而v-show有更高的初始渲染开销。因此,如果需要非常频繁地切
    换,则使用v-show较好;如果在运行时条件很少改变,则使用v-if较好。
  • v-show:显示用户名登录
    在这里插入图片描述
    v-show:显示邮箱登录
    在这里插入图片描述
  • v-if : 显示用户登录

    在这里插入图片描述

三、循环

  • 在模板中可以用v-for指令来循环数组,对象等

1、循环数组

<div id="app">
        <table class="table table-bordered">
            <tr>
                <td>序号</td>
                <td>标题</td>
                <td>作者</td>
            </tr>
            <!-- index是索引 -->
            <tr v-for="(book, index) in books">
                <td>{{ index+1 }}</td>
                <td>{{book.title}}</td>
                <td>{{book.author}}</td>
            </tr>
        </table>
    </div>
    <script>
        let vm = new Vue({
            el: "#app",
            data: {
                books: [
                    {'title': 'python', 'author': '龟叔'},
                    {'title': 'PHP', 'author': 'xxx'},
                    {'title': 'java', 'author': 'zzz'}
                ]
            },
        });
    </script>

在这里插入图片描述

2、循环对象

<div id="app">
        <div v-for="value,key in person">
            {{key}} -- {{value}}
        </div>
        <br>
        -------------------------------------------
        <br>
        <table class="table table-bordered">
            <tr v-for="value,key in person">
                <td>{{key}}</td>
                <td>--</td>
                <td>{{value}}</td>
            </tr>
        </table>
    </div>
    <script>
        let vm = new Vue({
            el: "#app",
            data: {
                person: {
                    'username': '老萝卜',
                    'age': 18,
                    'gender': '男'
                }
            },
        });
    </script>

在这里插入图片描述

3、保持状态

  • 循环出来的元素,如果没有使用key元素来唯一标识,如果后期的数据发生了更改,默认是会重用的,并且元素的顺序不会跟着数据的顺序更改而更改
<!--  未保持状态--> 
<div id="app">
        <div v-for="(book, index) in books">
            <span>{{ book }}</span>            
            <input type="text" placeholder="请输入书名">
        </div>
        <button @click='ChangeBooks'>更换图书</button>
    </div>
    <script>
        let vm = new Vue({
            el: "#app",
            data: {
                books:["java","python","C#"]
            },
            methods:{
                ChangeBooks(){
                    this.books.sort(function(a,b){
                        // console.log(a,b)
                        return 5 - parseInt(Math.random()*10)
                    })
                },
            },
        });
    </script>

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

<div id="app">
        <span>未绑定</span><br>
        <div v-for="(book, index) in books">
            <span>{{ book }}</span>            
            <input type="text" placeholder={{book}}>
        </div>
        --------------------------------------------------------------------<br>
        <span>已绑定</span>>
        <div v-for="(book, index) in books" v-bind:key='book'>
            <span>{{ book }}</span>            
            <input type="text" v-bind:placeholder="book" >
        </div>
        <button @click='ChangeBooks'>更换图书</button>
    </div>

    <script>
        let vm = new Vue({
            el: "#app",
            data: {
                books:["java","python","C#"]
            },
            methods:{
                ChangeBooks(){
                    this.books.sort(function(a,b){
                        // console.log(a,b)
                        return 5 - parseInt(Math.random()*10)
                    })
                },
            },
        });
    </script>

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值