• Vue -- 基础


    Vue

    Vue :它是构建用户界面的JavaScript框架(让它自动生成js,css,html等)

    Vue的使用

    语法

    vue的使用要从创建Vue对象
     var vm = new Vue({
             el:"#app",
              data: {
                 数据变量:"变量值",
                 数据变量:"变量值",
                 数据变量:"变量值",
              },
       });

      el:设置vue可以操作的html内容范围,值一般就是css的id选择器。
      data: 保存vue.js中要显示到html页面的数据。

    基本使用

    <!--    1.引用Vue核心文件-->
        <script src="Vue/vue/vue.min.js"></script>
    </head>
    <body>
    <!--       3.填写Vue语法控制数据-->
    <div id="k">{{message}}</div>
    <script>
        // 2.实例化Vue对象,实例化的变量是唯一的
        var vm = new Vue({
            el:"#k",
            data:{
                message:"hello world"
            }
        })
    </script>

    注意事项

    1. Vue实例化的对象是独立的
    2. Vue语法区分大小写
    3. Vue对象代码写在body后面

    MVVM架构思想

     MVVM 是Model-View-ViewModel 的缩写,它是一种基于前端开发的架构模式。MVVM的数据的修改与增加都是同步的

     model:模板,数据展示到页面中

     views:视图,数据要显示的HTML页面

     viewsmodel:双向数据绑定,负责连接 View 和 Model,保证视图和数据的一致性

     

    <!--    1.引用Vue核心文件-->
        <script src="Vue/vue/vue.min.js"></script>
    </head>
    <body>
    <!--       3.填写Vue语法控制数据-->
    <div id="k">
        <input v-model="message">
        {{message}}
    </div>
    <script>
        // 2.实例化Vue对象,实例化的变量是唯一的
        var vm = new Vue({
            el:"#k",
            data:{
                message:"hello world"
            }
        })
    </script>

     在浏览器中可以在 console.log通过 vm对象可以直接访问el和data属性,甚至可以访问data里面的数据

    console.log(vm.$el)     # #box  vm对象可以控制的范围
    console.log(vm.$data);  # vm对象要显示到页面中的数据
    console.log(vm.$data.message);  # 访问data里面的数据
    console.log(vm.message);# 这个 message就是data里面声明的数据,也可以使用 vm.变量名显示其他数据,message只是举例.

    数据显示

      1.纯文本数据用 {{ }}表示

    <!--    1.引用Vue核心文件-->
        <script src="Vue/vue/vue.min.js"></script>
    </head>
    <body>
    <!--       3.填写Vue语法控制数据-->
    <div id="k">
        <h1>message</h1>
    </div> <script> // 2.实例化Vue对象,实例化的变量是唯一的 var vm = new Vue({ el:"#k", data:{ message:"hello world" } }) </script>

      2.单标签使用 v-model方法

    <!--    1.引用Vue核心文件-->
        <script src="Vue/vue/vue.min.js"></script>
    </head>
    <body>
    <!--       3.填写Vue语法控制数据-->
    <div id="k">
        <input v-model="message">
        {{message}}
    </div>
    <script>
        // 2.实例化Vue对象,实例化的变量是唯一的
        var vm = new Vue({
            el:"#k",
            data:{
                message:"hello world"
            }
        })
    </script>

      3.双标签使用 v-html方法

    <!--    1.引用Vue核心文件-->
        <script src="Vue/vue/vue.min.js"></script>
    </head>
    <body>
    <!--       3.填写Vue语法控制数据-->
    <div class="k">
        <span v-html="message"></span>
    </div>
    <script>
        // 2.实例化Vue对象,实例化的变量是唯一的
        var vm = new Vue({
            el:".k",
            data:{
                message:"<a>hello world</a>"
            }
        })
    </script>
    
    </body>
    </html>

    常用指令

    属性操作

    语法

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

    <!--    1.引用Vue核心文件-->
        <script src="Vue/vue/vue.min.js"></script>
    </head>
    <body>
    <!--       3.填写Vue语法控制数据-->
    <div class="k">
        <a :href="url">百度</a>
        
    </div>
    <script>
        // 2.实例化Vue对象,实例化的变量是唯一的
        var vm = new Vue({
            el:".k",
            data:{
                url:"http//www.daidu.com"
            }
        })
    </script>

    例子:显示密码

    <!--    1.引用Vue核心文件-->
        <script src="Vue/vue/vue.min.js"></script>
    </head>
    <body>
    <!--       3.填写Vue语法控制数据-->
    <div id="k">
        密码:<input :type="type" ><button @click="change">显示密码</button>
    
    </div>
    <script>
        // 2.实例化Vue对象,实例化的变量是唯一的
       var vm = new Vue({
           el:"#k",
           data:{
               type:"password",
               password:"",
           },
           methods:{
               change(){
                   if(this.type=="password"){this.type="text";}
                   else {this.type="password";}
    
               }
           }
    
       })
    </script>

    事件操作

    语法

      <h1 @click="num++">{{num}}</h1>

    有两种事件操作的写法,@事件名 和 v-on:事件名

    <button v-on:click="num++">按钮</button>  
    <button @click="num+=5">按钮2</button>

    例子:

       <script src="Vue/vue/vue.js"></script>
    </head>
    <body>
    <div id="index">
        商品:<button @click="sub">-</button>
            <input type="text" v-model="goods.num">
            <button @click="goods.num++">+</button>
    </div>
        <script>
            var vm = new Vue({
                el:"#index",
                data:{goods:{num:0}},
                methods:{sub(){if(this.goods.num --<1){this.goods.num=0}}}
            })
        </script>
    </body>

    样式操作

    控制标签class类名语法

       <h1 :class="值">元素</h1>  值可以是字符串、对象、对象名、数组

    <style>
        .box1{
            color: red;
            border: 1px solid #000;
        }
        .box2{
            background-color: orange;
            font-size: 32px;
        }
        </style>
    </head>
    <body>
    <div id="box">
        <idv :class="cls">字符串</idv>
        <br>
        <idv :class="{box1:false}">对象</idv>
        <br>
        <idv :class="[cls,cls1]">数组</idv>
        <br>
        <idv :class="cls3?'box1':''">三元表达式</idv>
    
    </div>
        <script>
            var vm = new Vue({
                el:"#box",
                data:{cls:"box2",
                cls1:{
                    box1:false,
                    box2:true,
                },
                cls3:true},
            methods:{}})
    
        </script>
    </body>

    控制标签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"
                         }
                    }

    vue版本选项卡

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            #card{
                width: 500px;
                height: 350px;
            }
            .title{
                height:50px;
            }
            .title span{
                width: 100px;
                height: 50px;
                background-color:#ccc;
                display: inline-block;
                line-height: 50px; /* 设置行和当前元素的高度相等,就可以让文本内容上下居中 */
                text-align:center;
            }
            .content .list{
                width: 500px;
                height: 300px;
                background-color: yellow;
                display: none;
            }
            .content .active{
                display: block;
            }
    
            .title .current{
                background-color: yellow;
            }
        </style>
        <script src="Vue/vue/vue.min.js"></script>
    </head>
    <body>
    
        <div id="card">
            <div class="title">
                <span @click="num=0" :class="num==0?'current':''">国内新闻</span>
                <span @click="num=1" :class="num==1?'current':''">国际新闻</span>
                <span @click="num=2" :class="num==2?'current':''">银河新闻</span>
                <!--<span>{{num}}</span>-->
            </div>
            <div class="content">
                <div class="list" :class="num==0?'active':''">国内新闻列表</div>
                <div class="list" :class="num==1?'active':''">国际新闻列表</div>
                <div class="list" :class="num==2?'active':''">银河新闻列表</div>
            </div>
        </div>
        <script>
            var vm = new Vue({
                el:"#card",
                data:{
                    num:0,
                },
            });
    
        </script>
    
    </body>
    </html>

    条件渲染指令

    v-if

    <style>
        .box{
             width:200px ;
             height:30px;
            background-color: red;
    }
    </style>
    
    <body>
    <div id="app">
        <button>登录</button>
        <div class="box" v-if="is_show">登录窗口</div>
    </div>
        <script>
            var vm = new Vue({
                el:"#app",
                data:{
                    is_show:false
                }
            })
    
        </script>

    v-else

    <div id="app">
        <p v-if="is_show"><a>登录</a></p>
        <p v-else="is_show"><a>退出</a></p>
    </div>
        <script>
            var vm = new Vue({
                el:"#app",
                data:{
                    is_show:false
                }
            })
        </script>

    v-else-if

    <div id="app">
        <p v-if="num==1"><a>1</a></p>
        <p v-else-if="num==2"><a>2</a></p>
        <p v-else="num==3"><a>3</a></p>
    </div>
        <script>
            var vm = new Vue({
                el:"#app",
                data:{
                    num:3
                }
            })
        </script>

    v-show

    用法和v-if大致一样,区别在于2点:

    1. v-show后面不能v-else或者v-else-if

    2. v-show隐藏元素时,使用的是display:none来隐藏的,而v-if是直接从HTML文档中移除元素[ DOM操作中的remove ]

    <div id="app">
        <p v-show="is_show">隐藏</p>
    </div>
        <script>
            var vm = new Vue({
                el:"#app",
                data:{
                    is_show:true
                }
            })
        </script>

    列表渲染指令

    div id="app">
        <table border="1" align="center">
            <tr>
                <th>序号</th>
                <th>ID</th>
                <th>标题</th>
                <th>价格</th>
            </tr>
            <tr v-for="book,index in book_list">
                <td>{{index+1}}</td>
                <td>{{book.id}}</td>
                <td>{{book.title}}</td>
                <td>{{book.price}}</td>
            </tr>
        </table>
    </div>
        <script>
            var vm = new Vue({
                el:"#app",
                data:{
                    book_list:[
                            {"id":1,"title":"图书名称1","price":200},
                            {"id":2,"title":"图书名称2","price":200},
                            {"id":3,"title":"图书名称3","price":200},
                            {"id":4,"title":"图书名称4","price":200},
                        ]
                }
            })
        </script>

    Vue对象提供的属性功能

    过滤器

    使用filter()可以进行全局定义或者局部定义

    <div id="app">
        <p>{{money|func}}</p>
        <p>{{money}}</p>
    
    </div>
    <script>
        // 全局引用
        Vue.filter("func",function (money) {return money.toFixed(2)+""})
        var app = new Vue({
            el:"#app",
            data:{
                money:123.123123
            },
            // 局部使用
            // filters:{
            //     func(money){return money.toFixed(2)+"元"}
            // }
        })
    
    
    </script>

    计算和侦听属性

    计算属性 computed

    <div id="app">
        <input type="text" v-model="num1">+<input type="text" v-model="num2">=<span>{{total}}</span>
    </div>
    <script>
        var app = new Vue({
            el:"#app",
            data:{
                num1:0,
                num2:0,
            },
            computed:{
                total(){return parseFloat(this.num1)+parseFloat(this.num2)}
            }
        })
    
    </script>

    监听属性 watch

    <div id="app">
        <button @click="num++">点赞{{num}}</button>
    
    </div>
    <script>
    
        var app = new Vue({
            el:"#app",
            data:{num:0},
            watch:{
                num(){if(this.num>5)this.num=5}
            }
        })
    
    </script>

    vue对象的生命周期

     <script>
        window.onload = function(){
            var vm = new Vue({
                el:"#app",
                data:{
                    num:0
                },
                beforeCreate:function(){
                    console.log("beforeCreate,vm对象尚未创建,num="+ this.num);  //undefined
                    this.name=10; // 此时没有this对象呢,所以设置的name无效,被在创建对象的时候被覆盖为0
                },
                created:function(){
                    console.log("created,vm对象创建完成,设置好了要控制的元素范围,num="+this.num );  // 0
                    this.num = 20;
                },
                beforeMount:function(){
                    console.log( this.$el.innerHTML ); // <p>{{num}}</p>
                    console.log("beforeMount,vm对象尚未把data数据显示到页面中,num="+this.num ); // 20
                    this.num = 30;
                },
                mounted:function(){
                    console.log( this.$el.innerHTML ); // <p>30</p>
                    console.log("mounted,vm对象已经把data数据显示到页面中,num="+this.num); // 30
                },
                beforeUpdate:function(){
                    // this.$el 就是我们上面的el属性了,$el表示当前vue.js所控制的元素#app
                    console.log( this.$el.innerHTML );  // <p>30</p>
                    console.log("beforeUpdate,vm对象尚未把更新后的data数据显示到页面中,num="+this.num); // beforeUpdate----31
                    
                },
                updated:function(){
                    console.log( this.$el.innerHTML ); // <p>31</p>
                    console.log("updated,vm对象已经把过呢更新后的data数据显示到页面中,num=" + this.num ); // updated----31
                },
            });
        }
        </script>
    </head>
    <body>
        <div id="app">
            <p>{{num}}</p>
            <button @click="num++">按钮</button>
        </div>
    </body>

    阻止事件冒泡,刷新页面

    使用.stop和.prevent

     <style>
            .box1{
                width: 200px;
                height: 200px;
                background: #ccc;
            }
            .box2{
                width: 100px;
                height: 100px;
                background: pink;
            }
        </style>
        <script src="js/vue.min.js"></script>
        <script>
        window.onload = function(){
            var vm = new Vue({
                el:"#app",
                data:{}
            })        
        }
        </script>
    </head>
    <body>
        <div id="app">
            <div class="box1" @click="alert('box1')">
                <div class="box2" @click.stop.prevent="alert('box2')"></div>   <!-- @click.stop来阻止事件冒泡 -->
            </div>
    
            <form action="#">
                <input type="text">
                <input type="submit">
                <input type="submit" value="提交02" @click.prevent=""> <!-- @click.prevent来阻止表单提交 -->
            </form>
        </div>
    
    </body>

    例子:todolist

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>todolist</title>
        <style type="text/css">
            .list_con{
                width:600px;
                margin:50px auto 0;
            }
            .inputtxt{
                width:550px;
                height:30px;
                border:1px solid #ccc;
                padding:0px;
                text-indent:10px;
            }
            .inputbtn{
                width:40px;
                height:32px;
                padding:0px;
                border:1px solid #ccc;
            }
            .list{
                margin:0;
                padding:0;
                list-style:none;
                margin-top:20px;
            }
            .list li{
                height:40px;
                line-height:40px;
                border-bottom:1px solid #ccc;
            }
    
            .list li span{
                float:left;
            }
    
            .list li a{
                float:right;
                text-decoration:none;
                margin:0 10px;
            }
        </style>
        <script src="js/vue.js"></script>
    </head>
    <body>
        <div id="todolist" class="list_con">
            <h2>To do list</h2>
            <input type="text" v-model="message" class="inputtxt">
            <input type="button" @click="addItem" value="增加" class="inputbtn">
            <ul id="list" class="list">
                <li v-for="item,key in dolist">
                    <span>{{item}}</span>
                    <a @click="upItem(key)" class="up" ></a>
                    <a @click="downItem(key)" class="down"></a>
                    <a @click="delItem(key)" class="del">删除</a>
                </li>
            </ul>
        </div>
        <script>
        // 计划列表代码
        let vm = new Vue({
            el:"#todolist",
            data:{
                message:"",
                dolist:[
                    "学习html",
                    "学习css",
                    "学习javascript",
                ]
            },
            methods:{
                addItem(){
                    if(this.messsage==""){
                        return false;
                    }
    
                    this.dolist.push(this.message);
                    this.message = ""
                },
                delItem(key){
                    this.dolist.splice(key, 1);
                },
                upItem(key){
                    if(key==0){
                        return false;
                    }
                    // 向上移动
                    let result = this.dolist.splice(key,1);
                    this.dolist.splice(key-1,0,result[0]);
                },
                downItem(key){
                    // 向下移动
                    let result = this.dolist.splice(key, 1);
                    console.log(result);
                    this.dolist.splice(key+1,0,result[0]);
                }
            }
        })
        </script>
    </body>
    </html>
  • 相关阅读:
    LeetCode 297. Serialize and Deserialize Binary Tree 二叉树的序列化与反序列化(C++/Java)
    LeetCode 381. Insert Delete GetRandom O(1)
    LeetCode 380. Insert Delete GetRandom O(1) 常数时间插入、删除和获取随机元素(C++/Java)
    LeetCode 673. Number of Longest Increasing Subsequence 最长递增子序列的个数 (C++/Java)
    LeetCode 675. Cut Off Trees for Golf Event 为高尔夫比赛砍树 (C++/Java)
    LeetCode 460. LFU Cache LFU缓存 (C++/Java)
    LeetCode 451. Sort Characters By Frequency 根据字符出现频率排序 (C++/Java)
    LeetCode 332. Reconstruct Itinerary重新安排行程 (C++/Java)
    LeetCode 295. Find Median from Data Stream数据流的中位数 (C++/Java)
    Codeforces Round #318 (Div. 2) A Bear and Elections (优先队列模拟,水题)
  • 原文地址:https://www.cnblogs.com/zhenghuiwen/p/13144620.html
Copyright © 2020-2023  润新知