• vue学习(转载)


    vue.js库的基本使用

      第一步:下载

        官网地址:https://cn.vuejs.org/v2/guide/installation.html

      第二步:放到项目的文件目录下

        一般新建一个js文件夹,放到js文件夹下

      第三步:在文档中导入

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

      第四步:使用vue

    复制代码
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script src="js/vue.js"></script>  <!--导入js文件-->
    </head>
    <body>
    
    <div id="one">
        <h1>{{message}}</h1>
    </div>
    
    <script>
    
        let vm=new Vue({             //实例化vue对象
            el:'#one',                      //绑定控制区域
            data:{                          //数据属性
                message:'hello'
            }
        });
        
    </script>
    
    </body>
    </html>
    复制代码

     vue.js的M-V-VM思想

    MVVM 是Model-View-ViewModel 的缩写,它是一种基于前端开发的架构模式。

    Model 指代的就是vue对象的data属性里面的数据。这里的数据要显示到页面中。

    View 指代的就是vue中数据要显示的HTML页面,在vue中,也称之为“视图模板” 。

    ViewModel 指代的是vue.js中我们编写代码时的vm对象了,它是vue.js的核心,负责连接 View 和 Model,保证视图和数据的一致性。

     

     显示数据

    1、作为标签的内容显示,使用{{ value }}的形式,支持使用js代码

    <h1>{{str1.split("").reverse().join("")}}</h1>
    <!-- 3.2 支持js的运算符-->
    <h1>{{num1+3}}</h1>

    <!-- 3.3 js还有一种运算符,三元运算符,类似于python里面的三元表达式
    三元运算符的语法:
    判断条件 ? 条件为true : 条件为false的结果

    python 三元表达式[三目运算符]的语法:
    a if 条件 else b
    -->
    <h1>num1和num2之间进行比较,最大值:{{ num2>num1?num2:num1 }}</h1>

    使用js代码

    复制代码
    <h1>{{str1.split("").reverse().join("")}}</h1>
        <!-- 3.2 支持js的运算符-->
        <h1>{{num1+3}}</h1>
    
        <!-- 3.3 js还有一种运算符,三元运算符,类似于python里面的三元表达式
            三元运算符的语法:
             判断条件 ? 条件为true : 条件为false的结果
    
            python 三元表达式[三目运算符]的语法:
            a if 条件 else b
         -->
        <h1>num1和num2之间进行比较,最大值:{{ num2>num1?num2:num1 }}</h1>
    复制代码

    2、作为表单元素的值显示,使用 v-model = "name",而且数据是双向绑定的,表单的值发生变化,data跟着变;data发生变化,表单的显示也跟着变

    3、输出htnl代码,使用v-html

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="js/vue.js"></script>
    </head>
    <body>
    <div class="app">
    <h1>{{title}}</h1>
    <h3>{{url1}}</h3>
    {{img}}<br>
    <span v-html="img"></span>
    </div>
    <script>
    let vm = new Vue({
    el:".app",
    data:{
    title:"我的vue",
    url1:"我的收获地址",
    img:'<img src="images/shendan.png">',
    }
    })
    </script>
    </body>
    </html>

    输出html内容

    复制代码
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script src="js/vue.js"></script>
    </head>
    <body>
        <div class="app">
            <h1>{{title}}</h1>
            <h3>{{url1}}</h3>
            {{img}}<br>
            <span v-html="img"></span>
        </div>
        <script>
            let vm = new Vue({
                el:".app",
                data:{
                    title:"我的vue",
                    url1:"我的收获地址",
                    img:'<img src="images/shendan.png">',
                }
            })
        </script>
    </body>
    </html>
    复制代码

    常用指令

    指令(directives)是带有"v-"前缀的特殊属性,每一个指令在vue中都用固定的作用,常用的有v-if,v-for,v-model等等。

    指令会在vm对象中的data属性的数据发生变化时,同步改变元素中其控制的内容或属性。

    vue指令的两种写法:

    vue1.x写法             vue2.x的写法
    v-html         ---->   {{  }}
    v-bind:属性名   ---->   :属性
    v-on:事件名     ---->   @事件名
    vue1.x写法             vue2.x的写法
    v-html         ---->   {{  }}
    v-bind:属性名   ---->   :属性
    v-on:事件名     ---->   @事件名

    1、操作属性

    格式:    <标签名 :标签属性="data"></标签名>

    <p :title="str1">{{ str1 }}</p> <!-- 也可以使用v-html显示双标签的内容,{{  }} 是简写 -->
    <a :href="url2">淘宝</a>
    <a v-bind:href="url1">百度</a>  <!-- v-bind是vue1.x版本的写法 -->

    2、绑定事件

    <button v-on:click="num++">按钮</button>   <!-- v-on 是vue1.x版本的写法 -->
    <button @click="num+=5">按钮2</button>

    3、操作样式

    3.1 控制标签的style样式

    格式1:值是json对象,对象写在元素的:style属性中
    标签元素:
    <div :style="{color: activeColor, fontSize: fontSize + 'px' }"></div>
    data数据如下:
    data: {
    activeColor: 'red',
    fontSize: 30
    }
    格式2:值是对象变量名,对象在data中进行声明
    标签元素:
    <div v-bind:style="styleObject"></div>
    data数据如下:
    data: {
    styleObject: {
    color: 'red',
    fontSize: '13px'
    }
    }

    格式3:值是数组
    标签元素:
    <div v-bind:style="[style1, style2]"></div>
    data数据如下:
    data: {
    style1:{
    color:"red"
    },
    style2:{
    background:"yellow",
    fontSize: "21px"
    }
    }

    控制style属性

    复制代码
    格式1:值是json对象,对象写在元素的:style属性中
         标签元素:
                 <div :style="{color: activeColor, fontSize: fontSize + 'px' }"></div>
         data数据如下:
             data: {
                 activeColor: 'red',
                 fontSize: 30
             }
    格式2:值是对象变量名,对象在data中进行声明
       标签元素:
                   <div v-bind:style="styleObject"></div>
       data数据如下:
             data: {
                    styleObject: {
                         color: 'red',
                         fontSize: '13px'
                              }
                     }
    
    格式3:值是数组
      标签元素:
                    <div v-bind:style="[style1, style2]"></div>
        data数据如下:
                    data: {
                         style1:{
                           color:"red"
                         },
                         style2:{
                           background:"yellow",
                           fontSize: "21px"
                         }
                    }
    复制代码

    3.2 控制class类名 

    格式:<h1 :class="值">元素</h1> 

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="js/vue.js"></script>
    <style>
    .box1{
    color: red;
    border: 1px solid #000;
    }
    .box2{
    background-color: orange;
    font-size: 32px;
    }
    </style>
    </head>
    <body>
    <div id="box">
    <!--- 添加class类名,值是一个对象
    {
    class类1:布尔值变量1,
    class类2:布尔值变量2,
    }
    -->
    <p :class="{box1:myclass1}">一个段落</p>
    <p @click="myclass3=!myclass3" :class="{box1:myclass2,box2:myclass3}">一个段落</p>
    </div>
    <script>
    let vm1=new Vue({
    el:"#box",
    data:{
    myclass1:false, // 布尔值变量如果是false,则不会添加对象的属性名作为样式
    myclass2:true, // 布尔值变量如果是true,则不会添加对象的属性名作为样式
    myclass3:false,
    },
    })
    </script>

    <!-- 上面的代码可以:class的值保存到data里面的一个变量,然后使用该变量作为:class的值 这种最常用-->
    <style>
    .box4{
    background-color: red;
    }
    .box5{
    color: green;
    }
    </style>
    <div id="app">
    <button @click="mycls.box4=!mycls.box4">改变背景</button>
    <button @click="mycls.box5=!mycls.box5">改变字体颜色</button>
    <p :class="mycls">第二个段落</p>
    </div>
    <script>
    let vm2 = new Vue({
    el:"#app",
    data:{
    mycls:{
    box4:false,
    box5:true
    },
    }
    })
    </script>

    <!-- 批量给元素增加多个class样式类 -->
    <style>
    .box6{
    background-color: red;
    }
    .box7{
    color: green;
    }
    .box8{
    border: 1px solid yellow;
    }
    </style>
    <div id="app2">
    <p :class="[mycls1,mycls2]">第三个段落</p>
    </div>
    <script>
    let vm3 = new Vue({
    el:"#app2",
    data:{
    mycls1:{
    box6:true,
    box7:true,
    },
    mycls2:{
    box8:true,
    }
    }
    })
    </script>
    </body>
    </html>

    复制代码
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script src="js/vue.js"></script>
        <style>
        .box1{
            color: red;
            border: 1px solid #000;
        }
        .box2{
            background-color: orange;
            font-size: 32px;
        }
        </style>
    </head>
    <body>
        <div id="box">
            <!--- 添加class类名,值是一个对象
            {
             class类1:布尔值变量1,
             class类2:布尔值变量2,
            }
             -->
            <p :class="{box1:myclass1}">一个段落</p>
            <p @click="myclass3=!myclass3" :class="{box1:myclass2,box2:myclass3}">一个段落</p>
        </div>
        <script>
            let vm1=new Vue({
                el:"#box",
                data:{
                    myclass1:false, // 布尔值变量如果是false,则不会添加对象的属性名作为样式
                    myclass2:true,  // 布尔值变量如果是true,则不会添加对象的属性名作为样式
                    myclass3:false,
                },
            })
        </script>
    
        <!-- 上面的代码可以:class的值保存到data里面的一个变量,然后使用该变量作为:class的值  这种最常用--> 
        <style>
        .box4{
            background-color: red;
        }
        .box5{
            color: green;
        }
        </style>
        <div id="app">
            <button @click="mycls.box4=!mycls.box4">改变背景</button>
            <button @click="mycls.box5=!mycls.box5">改变字体颜色</button>
            <p :class="mycls">第二个段落</p>
        </div>
        <script>
            let vm2 = new Vue({
                el:"#app",
                data:{
                    mycls:{
                        box4:false,
                        box5:true
                    },
                }
            })
        </script>
    
        <!-- 批量给元素增加多个class样式类 -->
        <style>
        .box6{
            background-color: red;
        }
        .box7{
            color: green;
        }
        .box8{
            border: 1px solid yellow;
        }
        </style>
        <div id="app2">
                <p :class="[mycls1,mycls2]">第三个段落</p>
        </div>
        <script>
            let vm3 = new Vue({
                el:"#app2",
                data:{
                    mycls1:{
                        box6:true,
                        box7:true,
                    },
                    mycls2:{
                        box8:true,
                    }
                }
            })
        </script>
    </body>
    </html>
    复制代码

    4、条件渲染指令(v-if, v-show)

    v-if,v-show后跟的是布尔值,true则显示,false则隐藏

    复制代码
     标签元素:
                <h1 v-if="num==1">num的值为1</h1>
                <h1 v-else-if="num==2">num的值为2</h1>
              <h1 v-else>num的值是{{num}}</h1>
      data数据:
              data:{
                  num:2
          }
    复制代码
    标签元素:
                <h1 v-show="ok">Hello!</h1>
      data数据:
              data:{
                  ok:false    // true则是显示,false是隐藏
          }

    v-show 和v-if的区别:

      #v-show后面不能有v-else

      #v-show隐藏元素时,使用的是display:none来隐藏的,而v-if是直接从HTML文档中移除元素

    5、列表渲染指令

    通过v-for指令可以将一组数据渲染到页面中,数据可以是数组或者对象

    数据是数组:
    <ul>
    <!--i是列表的每一个元素-->
    <li v-for="i in list">{{i}}</li>
    </ul>

    <ul>
    <!--i是列表的每一个元素,j是每个元素的下标-->
    <li v-for="(i, j) in list">{{ j+1}}、{{i}}</li>
    </ul>

    数据是对象:
    <ul>
    <!--i是每一个value值-->
    <li v-for="i in obj1">{{i}}</li>
    </ul>
    <ul>
    <!--i是每一个value值,j是每一个键名-->
    <li v-for="(i, j) in obj1">{{j}}:{{i}}</li>
    </ul>

    v-for

    复制代码
    数据是数组:        
            <ul>
                <!--i是列表的每一个元素-->
                <li v-for="i in list">{{i}}</li>
            </ul>
    
            <ul>
                <!--i是列表的每一个元素,j是每个元素的下标-->
                <li v-for="(i, j) in list">{{ j+1}}、{{i}}</li>
            </ul>
    
    数据是对象:
            <ul>
                <!--i是每一个value值-->
                <li v-for="i in obj1">{{i}}</li>
            </ul>
            <ul>
                <!--i是每一个value值,j是每一个键名-->
                <li v-for="(i, j) in obj1">{{j}}:{{i}}</li>
            </ul>
    复制代码

    vue对象提供的属性功能

    1、过滤器

    过滤器可以用来过滤数据或格式化文本

    过滤器定义方式有两种:

    var vm = new Vue({
    el:"#app",
    data:{},
    filters:{
    RMB2:function(value){
    if(value==''){
    return;
    }else{
    return '¥ '+value;
    }
    }
    }
    });

    局部过滤器

    复制代码
    var vm = new Vue({
      el:"#app",
      data:{},
      filters:{
        RMB2:function(value){
          if(value==''){
            return;
          }else{
              return '¥ '+value;
          }
        }
        }
    });
    复制代码

    Vue.filter("RMB1", function(v){
    //就是来格式化(处理)v这个数据的
    if(v==0){
    return v
    }

    return v+"元"
    })

    全局过滤器

    复制代码
    Vue.filter("RMB1", function(v){
          //就是来格式化(处理)v这个数据的
          if(v==0){
                return v
          }
    
          return v+"元"   
    })
    复制代码

    2、阻止事件冒泡和页面刷新

    事件冒泡:在js的事件操作中,子元素的事件触发以后,会默认把事件传播给其父级元素,然后一层层往外传播,这种现象就是事件冒泡,添加.stop可以组织事件往外传播

    阻止页面刷新:

      超链接表单中的提交,希望阻止页面刷新,可以使用 @事件.prevent="" 

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="js/vue.js"></script>
    <style>
    .box1{
    200px;
    height:200px;
    background: #3c3c3c;
    }
    .box2{
    100px;
    height:100px;
    background:deeppink;
    }
    </style>
    <script>
    window.onload=function(){

    var vm =new Vue({
    el:'#app',
    data:{},
    methods:{
    alert:function(v){
    alert(v)
    }
    }
    })

    }
    </script>

    </head>
    <body>
    <div id="app">
    <div class="box1" @click="alert('box1')">
    <div class="box2" @click.stop="alert('box2')">
    啦啦啦德玛西亚
    </div>
    </div>

    <form action="#">
    <input type="text">
    <input type="submit">
    <input type="submit" value="提交2" @click.prevent="">

    </form>
    </div>

    </body>
    </html>

    阻止冒泡和刷新

    复制代码
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script src="js/vue.js"></script>
        <style>
            .box1{
                 200px;
                height:200px;
                background: #3c3c3c;
            }
            .box2{
                100px;
                height:100px;
                background:deeppink;
            }
        </style>
        <script>
            window.onload=function(){
    
                var vm =new Vue({
                    el:'#app',
                    data:{},
                    methods:{
                        alert:function(v){
                            alert(v)
                        }
                    }
                })
    
            }
        </script>
    
    </head>
    <body>
        <div id="app">
            <div class="box1" @click="alert('box1')">
                <div class="box2" @click.stop="alert('box2')">
                    啦啦啦德玛西亚
                </div>
            </div>
    
            <form action="#">
                <input type="text">
                <input type="submit">
                <input type="submit" value="提交2" @click.prevent="">
    
            </form>
        </div>
    
    
    
    </body>
    </html>
    复制代码

    3、计算和监听属性

    计算属性

    将调整data数据的代码放在计算属性(computed)中,就是对数据调整的封装,便于阅读

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="js/vue.min.js"></script>
    <script>
    window.onload = function(){
    var vm = new Vue({
    el:"#app",
    data:{
    str1: "abcdefgh"
    },
    computed:{ //计算属性:里面的函数都必须有返回值
    strRevs: function(){
    var ret = this.str1.split("").reverse().join("");
    return ret
    }
    }
    });
    }
    </script>
    </head>
    <body>
    <div id="app">
    <p>{{ str1 }}</p>
    <p>{{ strRevs }}</p>
    </div>
    </body>
    </html>

    computed

    复制代码
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script src="js/vue.min.js"></script>
            <script>
            window.onload = function(){
            var vm = new Vue({
                el:"#app",
                data:{
                    str1: "abcdefgh"
                },
                computed:{   //计算属性:里面的函数都必须有返回值
                    strRevs: function(){
                        var ret = this.str1.split("").reverse().join("");
                        return ret
                    }
                }
            });
        }
        </script>
    </head>
    <body>
        <div id="app">
             <p>{{ str1 }}</p>
             <p>{{ strRevs }}</p>
        </div>
    </body>
    </html>
    复制代码

    监听属性

    可以监听一个数据,从而做出相应的自定义操作。

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


    <div id="one">
    <button @click="num-=1">-</button><span>{{num}}</span><button @click="num=num+1">+</button>

    </div>

    <script>
    let vm =new Vue({
    el:'#one',
    data:{
    num:2
    },
    watch:{
    num:function(newval,oldval){
    console.log(newval,oldval)
    if (newval == 0){
    alert('数值已经减到最小了')
    }else if(newval<0){
    alert('数据有误')
    }
    }
    }

    })
    </script>

    </body>
    </html>

    watch

    复制代码
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script src="js/vue.js"></script>
    </head>
    <body>
    
    
    <div id="one">
        <button @click="num-=1">-</button><span>{{num}}</span><button @click="num=num+1">+</button>
    
    </div>
    
    <script>
        let vm =new Vue({
            el:'#one',
            data:{
                num:2
            },
            watch:{
                num:function(newval,oldval){
                    console.log(newval,oldval)
                    if (newval == 0){
                        alert('数值已经减到最小了')
                    }else if(newval<0){
                        alert('数据有误')
                    }
                }
            }
    
        })
    </script>
    
    </body>
    </html>
    复制代码

    4、vue对象的生命周期

    每个vue对象在创建时都要经过一系列的初始化过程,在这个过程中vue.js会自动运行一些叫做生命周期的钩子函数,我们可以使用这些函数,在对象创建的不同阶段加上我们需要的代码,实现特定的功能

    部分钩子函数及作用:

      beforeCreate:function(){}   //实例刚被创建,data属性还未初始化

      created:function(){}  //初始化data,但未初始化dom

      beforeMount(){}    //初始化dom

      mounted(){}     //data显示到页面

      beforeUpdate(){}  // vm对象还未把更新的数据显示到页面

      update(){}    //vm对象把更新的数据显示到了页面

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

    <div id="app">
    <p>{{num}}</p>
    <button @click="num++">按钮</button>
    </div>

    <script>
    let vm = new Vue({
    el:'#app',
    data:{
    num:0
    },
    beforeCreate:function () { //尚未初始化
    console.log('beforeCreate:',this)
    console.log('num:',this.num)
    },
    created:function () {
    console.log('Created:',this)
    console.log('num:',this.num) //初始化了data
    console.log('el:',this.$el)
    },
    beforeMount:function () {
    console.log('beforeMount:',this)
    console.log('num:',this.num)
    console.log('el:',this.$el.innerHTML) //初始化$el
    },
    mounted:function () {
    console.log('mounted:',this)
    console.log('num:',this.num)
    console.log('mounted_el:',this.$el.innerHTML) //data 显示到页面

    },
    beforeUpdate:function () {
    console.log('beforeUpdate_el:',this.$el.innerHTML) //vm对象还未把更新的数据显示到页面
    },
    updated:function(){
    console.log('updated_el:',this.$el.innerHTML) //vm对象把更新的数据显示到了页面
    }

    })
    </script>

    </body>
    </html>

    钩子函数

    复制代码
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script src="js/vue.js"></script>
    </head>
    <body>
    
    <div id="app">
            <p>{{num}}</p>
            <button @click="num++">按钮</button>
    </div>
    
    <script>
        let vm = new Vue({
            el:'#app',
            data:{
                num:0
            },
            beforeCreate:function () {     //尚未初始化
                console.log('beforeCreate:',this)
                console.log('num:',this.num)
            },
            created:function () {
                console.log('Created:',this)
                console.log('num:',this.num)   //初始化了data
                 console.log('el:',this.$el)
            },
            beforeMount:function () {
                console.log('beforeMount:',this)
                console.log('num:',this.num)
                console.log('el:',this.$el.innerHTML)   //初始化$el
            },
            mounted:function () {
                 console.log('mounted:',this)
                console.log('num:',this.num)
                console.log('mounted_el:',this.$el.innerHTML)   //data 显示到页面
    
            },
            beforeUpdate:function () {
                 console.log('beforeUpdate_el:',this.$el.innerHTML)   //vm对象还未把更新的数据显示到页面
            },
            updated:function(){
                console.log('updated_el:',this.$el.innerHTML)   //vm对象把更新的数据显示到了页面
            }
    
        })
    </script>
    
    </body>
    </html>
    复制代码

      

      

      

     

     

     
     
  • 相关阅读:
    hdu2476 string painter
    lightoj1422 Halloween Costumes
    cf1369D---找规律,递推
    cf1368D---贪心
    cf1373D---思维,最大子段和
    poj2279 Mr. Young's Picture Permutations
    AT2442 fohen phenomenon 差分
    poj2796 feel good 单调栈
    poj2082 terrible sets 单调栈
    洛谷P2979 cheese towers
  • 原文地址:https://www.cnblogs.com/wuyufeng-9-14/p/10531583.html
Copyright © 2020-2023  润新知