vue基本语法

作者: 爱学习的代代 | 来源:发表于2021-08-08 11:18 被阅读0次
一、推荐插件

Live Server 插件,保存后自动刷新浏览器

open in browser, 可以将html直接在浏览器中打开

二、el: 挂载点

el的作用是设置vue实例并挂载。

Q1: Vue实例的作用范围是什么呢?

Q2: 是否可以使用其他选择器?

Q3: 是否可以设置其他的DOM元素呢?

  1. el 挂载点支持的选择器,可以支持id、class选择器,标签选择器

  2. data数据的作用范围是声明的app的内部

  3. id选择器唯一,一般使用id选择器作为挂载的声明。

  4. 是否可以设置其他的DOM元素呢?

  • 可以使用其他的双标签,但是不能使用HTML和BODY
三、data: 数据对象
  • Vue中用到的对象定义在data中
  • data中可以写复杂的数据类型:比如字符串、数组、对象
  • 渲染复杂对象时,遵循js的语法即可。
<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>Vue 测试实例 - 菜鸟教程(runoob.com)</title>
    <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
</head>

<body>
    <div id="app" class="app">
        <span>{{ message }} </span>
        <h1>{{ introduction.name }}</h1>
        <h1>{{ introduction.mobile }}</h1>
        <h2>熟悉的语言</h2>
        <ul>
            <li>
                {{ goodAt[0] }}
            </li>
            <li>
                {{ goodAt[1] }}
            </li>
            <li> {{ goodAt[2] }}</li>
            <li> {{ goodAt[3] }}</li>
        </ul>
    </div>

    <script>
        var app = new Vue({
            // el: '.app',
            // el: 'div',
            el: '#app',
            data: {
                message: '开始学习Vue的第一天',
                introduction: {
                    name: "peter",
                    mobile: "14345665566"
                },
                goodAt: ['Java', 'PHP', 'Swift', 'Python']
            }
        })
    </script>
</body>

</html>
四、Vue指令
  1. 内容绑定: v-text, v-html, v-on基础

  2. 显示切换,属性绑定: v-show, v-if, v-bind

  3. 列表循环,表单元素绑定: v-for, v-on补充,v-model


v-text的作用:

  • 设置标签的内容

  • 默认写法会替换全部内容,使用差值表达值{{}},可以替换指定内容。

示例:

<body>
    <div id="app">
        <h2 v-text="message + '!'">上海</h2>
        <h2>{{ message + '!' }}上海 </h2>
    </div>
<script>
    var app = new Vue({
        el: '#app',
        data: {
            message: "测试消息",
            info: "前端vue学习"
        }
    }) 
</script>


v-html指令的作用:

  • 设置元素的innerHtml标签
  • 内容中的html结构会被设置成 标签
  • v-text指令无论内容是什么,都只会被解析成文本
  • 即解析文本使用v-text,如果需要解析html结构使用v-html。
<!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>vue 执行</title>
    <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>

</head>
<body>
    <div id="app">
        <h2 v-text="message + '!'">上海</h2>
        <h2>{{ message + '!' }}上海 </h2>
        <p v-html="content"></p>
        <p v-text="content"></p>
    </div>
<script>
    var app = new Vue({
        el: '#app',
        data: {
            message: "测试消息",
            info: "前端vue学习",
            content: "<a href='http://www.baidu.com'>百度</a>"
        }
    }) 
</script>


    
</body>
</html>

v-on基础:

  • v-on指令的作用是为元素添加绑定事件
  • 事件名不需要写on:v-on:click="doSomething"
  • 指令名可以简写成@click
  • 要绑定的方法写在methods中

示例:

<!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>vue 执行</title>
    <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>

</head>
<body> 
    <div id="app">
        <input type="button" value="v-on指令" v-on:click="doIt">
        <input type="button" value="v-on指令简写" @click="doIt">
        <input type="button" value="双击事件" @dblclick="doIt">
        <h2 @click="addFood">{{ food }} </h2>
    </div>
<script>
    var app = new Vue({ 
        el: '#app',
        data: {
          food: "西蓝花"  
        },
        methods:{
            doIt:function() {
                alert("做it")
            },
            addFood:function() {
                this.food += "加1个"
            }
        }
       
    }) 
</script>


    
</body>
</html>

练习:计数器

<!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>vue计数器</title>
    <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>

</head>
<body> 
    <div id="app">
        <button class="btn" @click="sub">-</button>
        <span id="number">{{ num }}</span>
        <button class="btn" @click="add">+</button>
    </div>
<script>
    var vue = new Vue({
        el: "#app",
        data:{
            num:0 
        },
        methods: {
            add: function(){
                if(this.num < 10) {
                    this.num++
                }else {
                    alert("已经超出最大值了,不可再增加了!")
                }
            },
            sub: function(){
                if(this.num > 0 ) {
                    this.num--
                }else {
                    alert("达到最小值了,不能再减了!")
                }
            
            }

        }
    })
</script>

<style>
    #app {
        margin-top: 100px;
        text-align: center;
    }
    #number {
        width: 100px;
        display: inline-block;
        /* display: -moz-inline-box; */
        background-color: white;
    }
    .btn {
        width: 100px;
        height: 60px;
        background-color: lightgray;
        border-radius: 5px;
    }
</style>
</body>
</html>

要点总结:

  • 创建Vue时:el(挂载点),data(数据), methods(方法)
  • v-on是用于给元素绑定事件
  • 方法中通过this获取data中的数据
  • v-text指令的作用是设置元素的文本值,简写为{{}}
  • v-html指令的作用是设置元素的innerHTML

v-show

  • 根据表达的真假来切换元素的展示与隐藏
  • 原理是修改元素的display,实现隐藏显示
  • 指令后面的内容,最终都会解析成布尔值
  • 值为true元素显示,值为false元素隐藏。

代码示例:

<!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>vue 执行</title>
    <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>

</head>
<body> 
    <div id="app">
        <input type="button" value="隐藏与显示" @click="displayOrNot">

        <img src="https://gimg2.baidu.com/image_search/src=http%3A%2F%2Finews.gtimg.com%2Fnewsapp_match%2F0%2F12111610486%2F0.jpg&refer=http%3A%2F%2Finews.gtimg.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1630309971&t=0a435278721989e72e1e62e0eb46113e" v-show="isShow" id = "jinchen" >
        <img src="https://gimg2.baidu.com/image_search/src=http%3A%2F%2Finews.gtimg.com%2Fnewsapp_match%2F0%2F12111610486%2F0.jpg&refer=http%3A%2F%2Finews.gtimg.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1630309971&t=0a435278721989e72e1e62e0eb46113e" v-show="age>25" id = "jinchen" >

    </div>
<script>
    var app = new Vue({
        el: '#app',
        data: {
            isShow: false,
            age: 20
        },
        methods: {
            displayOrNot:function() {
                // this.isShow = !this.isShow
                this.age++  
            }
        }
    }) 
</script>


<style>
    #jinchen{
        width: 200px;
        height: 360px;
    }
</style>    
</body>
</html>

v-if

  • 根据表达式的真假来切换元素的显示状态
  • 本质是通过操作dom元素来切换显示状态
  • 当表达式的值为true时,元素存在于dom树中,如果为false则将元素从dom树中移除。
  • 频繁的切换使用v-show, 反之使用v-if。 v-show切换带来的消耗小。

代码示例:

<!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>v-if指令</title>
    <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>

</head>
<body> 
    <div id="app">
        <input type="button" value="点击切换显示与隐藏" @click="toggleIsShow">
        <p v-if="isShow">今天是个好日子 v-if</p>
        <p v-show="isShow">今天是个好日子  v-show</p>
        <h3 v-if="temperature > 30">今天很热,注意防晒</h3>
    </div>
<script>
    var app = new Vue({
        el: '#app',
        data: {
            isShow: false,
            temperature: 20
        },
        methods: {
            toggleIsShow: function() {
                this.isShow = !this.isShow
            }
           
        }
    }) 
</script>
   
</body>
</html>

v-bind

  • 为元素绑定属性:比如(src, title, class )

  • 完整的写法是v-bind:属性名

  • 简写的话,可以直接忽略v-bind,只保留属性名。

  • 需要动态的增删class ,建议使用对象的方式。

v-bind:src

v-bind:title

v-bind:class

其中v-bind可以省略

<!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>v-bind指令</title>
    <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>

</head>

<style>
    .active {
        border: 1px solid red;
    }
</style>
<body> 
    <div id="app">
        <!-- 默认写法 -->
        <!-- <img src="imgSrc" alt=""> -->
        <br>
        <!-- 使用v-bind指令 -->
        <img v-bind:src="imgSrc">
        <br>
        <!-- 三元表达式 -->
        <img :src="imgSrc" alt="" :title="imgeTitle + '!!!'" :class="isActive ? 'active' : ''" @click="toggleActive">
        <br>
        <!--  对象引用的方式-->
        <img :src="imgSrc" alt="" title="imgeTitle + '使用对象的方式'" :class={active:isActive} @click="toggleActive">

    </div>
<script>
    var app = new Vue({
        el: '#app',
        data: {
            imgSrc: "https://gameplus-platform.cdn.bcebos.com/gameplus-platform/upload/file/img/6cf049a661ee8b72a828c951cd96bc20/6cf049a661ee8b72a828c951cd96bc20.png",
            imgeTitle: "王者峡谷一日游",
            isActive: false
        },
        methods: {

          toggleActive:function() {
              this.isActive = !this.isActive
          } 
        }
    }) 
</script>
   
</body>
</html>

案例: 图片轮播器

[图片上传失败...(image-4f996b-1628392641235)]

  1. 按钮左右元素
  2. 图片元素

分析:

  • 多张图片放到一个数组内
  • 切换的时候,修改显示元素的数组的索引
  • 边界值考虑:第一张不显示左侧按钮,最后一张不显示右侧按钮。

使用的知识点:

v-bind: 来控制图片的内容的更换(更改图片的属性)

v-on: 添加点击事件

v-show/v-if: 控制元素的显示与隐藏

代码示例:

说明: 其目的是防止链接跳转到其他页面。

href=”javascript:void(0);”这个的含义是,让超链接去执行一个js函数,而不是去跳转到一个地址,
而void(0)表示一个空的方法,也就是不执行js函数。
<!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>图片轮播图组件</title>
    <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>

</head>

<style>
    .a-btn {
        height: 21px;
            line-height: 21px;
            padding: 0 11px;
            background: #02bafa;
            border: 1px #26bbdb solid;
            border-radius: 3px;
            display: inline-block;
            text-decoration: none;
            font-size: 12px;
            outline: none;
            text-align: center;
    }
</style>

<body>
    <div id="app">
        <a href="javascript:void(0)" v-show="index!=0" @click="pre" class="a-btn">上一个</a>
        <img :src="imgArr[index]" alt="">
        <a href="javascript:void(0)" v-show="index<imgArr.length-1" @click="next" class="a-btn">下一个</a>
    </div>
    <script>
        var app = new Vue({
            el: '#app',
            data: {
                imgArr: ["./imgs/01.jpeg", "./imgs/02.jpeg", "./imgs/03.jpeg", "./imgs/04.jpeg", "./imgs/05.jpeg"],
                index: 0
            },
            methods: {
                pre: function () {
                    this.index--;
                    console.log(this.index);
                },
                next: function () {
                    this.index++;
                    console.log(this.index);
                }

            }
        })
    </script>

</body>

</html>

v-for 列表结构

  • v-for是根据数据生成列表结构
  • 数组经常和v-for结合使用
  • 语法是(item, index) in 数据
  • item, index可以结合其他指令一起执行
  • 数据长度的更新会同步到页面上,是响应式的。

代码示例:

<!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>v-for指令</title>
    <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>

</head>

<body> 
    <div id="app">
        <input type="button" @click="add" value="添加">
        <input type="button" @click="remove" value="移除">

        <p>中国好的城市城市如下:</p>
        <ul>
            <li v-for="(item, index) in citys">{{index}} 、{{ item }}</li>
        </ul>
    </div>
<script>
    var app = new Vue({
        el: '#app',
        data: {
            citys:["北京", "上海", "广州", "深圳"]
        },
        methods: {
            add: function() {
                this.citys.push("南京");
            },

            remove: function() {
                this.citys.shift();
            }

        }
    }) 
</script>
   
</body>
</html>

v-on 补充

传递自定义参数、事件修饰符。

  • 事件绑定的方法,写成函数调用的形式,可以传入自定义参数

  • 定义方式时,需要定义形参来接收传入的实参。

  • 事件的后面,修饰符可以对事件进行限制

  • .enter 可以限制触发的按键为回车

  • 时间修饰符有多种。

    <!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>v-for指令</title>
        <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
    
    </head>
    
    <body> 
        <div id="app">
            <input type="button" @click="add(3)" value="数字累加">
            <h2>{{ num }}</h2>
    <!-- 当输入完数据,回车时,触发事件 -->
            <input type="text" @keyup.enter="sayHi">
        </div>
    <script>
        var app = new Vue({
            el: '#app',
            data: {
                num: 0
            },
            methods: {
                add:function(num){
                    this.num += num
                },
                sayHi:function(){
                    alert("说早安!!!")
                }
            }
        }) 
    </script>
       
    </body>
    </html>
    

    v-model

    获取和设置数据的双向绑定

<!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>v-model指令</title>
    <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>

</head>

<body> 
    <div id="app">
        <input type="text" v-model="message">
        <input type="button" @click="setmessage" value="更改元素的值">
        <h2>{{ message }}</h2>

    </div>
<script>
    var app = new Vue({
        el: '#app',
        data: {
            message: "peter加油"
        },
        methods: {
            setmessage:function(){
                this.message="嗯啊, 好好加油"
            }
        }
    }) 
</script>
   
</body>
</html>

记事本应用代码

<html>

<head>
  <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
  <title>小黑记事本</title>
  <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
  <meta name="robots" content="noindex, nofollow" />
  <meta name="googlebot" content="noindex, nofollow" />
  <meta name="viewport" content="width=device-width, initial-scale=1" />
  <link rel="stylesheet" type="text/css" href="./css/index.css" />
</head>

<body>
  <!-- 主体区域 -->
  <section id="todoapp">
    <!-- 输入框 -->
    <header class="header">
      <h1>代代记事本</h1>
      <input v-model="inputValue" @keyup.enter="add" autofocus="autofocus" autocomplete="off" placeholder="请输入任务"
        class="new-todo" />
    </header>
    <!-- 列表区域 -->
    <section class="main">
      <ul class="todo-list">
        <li class="todo" v-for="(item, index) in list" >
          <div class="view">
            <span class="index">{{ index+1 }}.</span>
            <label>{{ item }}</label>
            <button class="destroy" @click="remove(index)"></button>
          </div>
        </li>
      </ul>
    </section>
    <!-- 统计和清空 -->
    <footer class="footer" >
      <span class="todo-count" v-show="list.length>0">
        <strong>{{ list.length }}</strong> items left
      </span>
      <button class="clear-completed" @click="removeAll">
        Clear
      </button>
    </footer>
  </section>
  <!-- 底部 -->
  <footer class="info">
    <p>
      <a href="http://www.itheima.com/"><img src="./img/black.png" alt="" /></a>
    </p>
  </footer>
  <!-- 开发环境版本,包含了有帮助的命令行警告 -->
  <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  <script>
    var app = new Vue({
      el: "#todoapp",
      data: {
        list: ["吃饭", "学习", "打豆豆"],
        inputValue: ""
      },
      methods: {
        add:function() {
          // 当输入为空的时候,不可以添加。
          console.log(this.inputValue)
          if (this.inputValue.length > 0) {
            this.list.push(this.inputValue);
            // 添加成功后需要将输入栏数据清空
            this.inputValue = "";

          } else {
            alert("输入的内容为空!!")
          }
        },
        remove:function(index) {
          console.log("remove")
          console.log(index);
          this.list.splice(index,1)
          
        },
        removeAll:function(){
          // this.list.splice(0,this.list.length)
          this.list = [];
        }
      },
    })
  </script>
</body>

</html>

三、网络库:axios

  • axios回调函数中的this已经改变了,无法通过this去访问到data中的数据
  • 解决办法: 将this保存起来,回调函数中直接使用保存的this即可。
  • 和本地应用最大的区别就是改变了数据源。

代码示例:

<!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>axios的使用</title>
    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    </script>
</head>

<body>
    <div id="app">
        <input type="button" value="发送get请求" @click="get_content">
        <p>{{ joke }}</p>
        <input type="button" value="发送post请求" @click="post_content">
        <!-- <h5>post请求获取的内容:{{ post_response}}</h5> -->

    </div>


    <script>
        var vue = new Vue({
            el: "#app",
            data: {
                joke: "一个笑话",
            },
            methods: {
                get_content: function(){
                    var that = this;
                    console.log(this.joke)
                    axios.get('https://autumnfish.cn/api/joke').then(function (response){
                        // console.log(response);
                        console.log(this.joke)
                        that.joke = response.data;
                    }, function(err) {
                        console.log(err)
                    })
                },
                post_content: function(){
                    axios.post('https://autumnfish.cn/api/user/reg', {username: "lilililili"}).then( function (response) {
                        console.log(response)
                    }, function(err) {
                        console.log(err)
                    })
                }
            }
            
        })
    </script>
</body>

</html>

应用: 天气查询功能

功能分析:

  • 获取输入城市(v-model)
  • 通过城市,查询天气()
  • 渲染页面
  • hotkey搜索,服用查询天气的逻辑

总结:

  • 自定义参数可以让代码的复用性更高
  • methods中定义的方法,可以通过this来获取已经声明过的方法。
五、综合应用- 音乐播放器
  • audio标签的play事件会在音频播放的时候触发

  • audio标签的pause事件会在音频暂停的时候触发

  • 通过对象的方式设置类名,类名生效与否取决于后面值的真假。

相关文章

  • Vue基本语法

    一、Vue介绍 1、Vue.js 是什么 Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面...

  • vue基本语法

    模板语法 文本 使用{{}}进行数据绑定 原始html 属性 使用表达式 指令 指令带有v前缀的属性 参数 动态参...

  • Vue基本语法

    一、Mustache 如何将data中的文本数据,插入到HTML中呢?我们已经学习过了,可以通过Mustache语...

  • vue基本语法

    快速入门 v-on: click 事件绑定 v-on:keydom 键盘绑定 v-on:mouseover 获取焦...

  • VUE基本语法

    一、template 二、script 三、style

  • vue基本语法

    一、推荐插件 Live Server 插件,保存后自动刷新浏览器 open in browser, 可以将htm...

  • 《二》、Vue核心——基本使用

    一、Vue的基本使用 1、编码 2、理解 Vue 的 MVVM 3、模板语法 (1)、模板语法的理解  Ⅰ、动态的...

  • 01Vue基本使用与模板语法

    Vue基本使用与模板语法 一. 基本使用 Hello World快速入门 二. 模板语法 指令 概述 指令的本质就...

  • vue基本语法2

    vue的模板里面 所有的内容要被一个根节点包含起来 数据绑定 数据绑定改变试讲 定义方法 执行方法 获取数据 改变...

  • Vue的基本语法

    本节将学习Vue的基础语法,为了简单,在html页面中采用 标签的形式引入vue。 主要目录: (1)声明书渲染 ...

网友评论

    本文标题:vue基本语法

    本文链接:https://www.haomeiwen.com/subject/edtovltx.html