zoukankan      html  css  js  c++  java
  • Vue入门及介绍,基础使用

    Vue快速使用

    1 vue:就是一个js框架,跟jquery很像
    2 cdn,下载到本地,script中引入
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title><script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script><body>
    <div id="app">
    ​
    {{ message }}
        <br>
        <h1>{{  name }}</h1>
    </div></body><script>
        //el:指的是被vue接管的div,以后再操作这个div,都是通过vue操作
        var app = new Vue({
            el: '#app',
            data: {
                message: 'Hello world!',
                name:'lqz'
            }
        })
    </script>
    </html>

    前端现状

    1 前后端混合开发(前端调好页面---》给后端,加模板语言)
    2 ajax:js跟后端交互,js从后端请求数据,js的dom操作渲染页面,前后端分离的雏形
    3 Angular框架的出现--js框架:前端工程化
    4 React、Vue框架:中国人中小型项目用Vue多,老外用React
    5 大前端的概念:
        -网站,ios,安卓,小程序
    6 谷歌:flutter框架,安卓,ios,无缝运行,桌面开发
        -Dart:语言,java很像
    7 uni-app:使用vue写---》编译成ios,安卓,网站的(初创型公司)
    8 在不久的将来 ,大前端框架可能会一统天下

    Vue介绍

    Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架

    与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用

    Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合

    渐进式框架

    可以一点一点地使用它,只用一部分,也可以整个项目都使用它,就是一个前端项目

    网站

    版本

    • 1.X:使用得较少

    • 2.X:普遍使用

    • 3.X:刚出没多久,只有Beta版

    Vue特点

    易用

    • 通过 HTML、CSS、JavaScript构建应用

    灵活

    • 不断繁荣的生态系统,可以在一个库和一套完整框架之间自如伸缩。

    高效

    • 20kB min+gzip 运行大小

    • 超快虚拟 DOM

    • 最省心的优化

    MVVM架构

    MVVM介绍

    1 M(数据层)----V(页面展示)----VM(vm)

    2 双向数据绑定:JS中变量变了,HTML中数据也跟着改变

    MVVM 是Model-View-ViewModel 的缩写,它是一种基于前端开发的架构模式,是一种事件驱动编程方式
    ​
    Model :vue对象的data属性里面的数据,这里的数据要显示到页面中
    View :vue中数据要显示的HTML页面,在vue中,也称之为“视图模板” (HTML+CSS)
    ViewModel:vue中编写代码时的vm对象,它是vue.js的核心,负责连接 View 和 Model数据的中转,保证视图和数据的一致性,所以前面代码中,
           data里面的数据被显示中p标签中就是vm对象自动完成的(双向数据绑定:JS中变量变了,HTML中数据也跟着改变)

    MVVM的特性

    • 低耦合视图(View)可以独立于Model变化和修改,1个ViewModel可以绑定到不同的View上,当View变化的时候 Model可以不变,当Model变化的时候 View也可以不变

    • 可复用:可以把一些视图逻辑放在1个ViewModel中,让很多View重用这端视图的逻辑(以此减少代码冗余)

    • 独立开发开发人员可以专注于业务逻辑数据的开发(ViewModel),设计人员可以专注于页面设计

    • 可测试:界面元素是比较难以测试的,而现在的测试可以针对ViewModel来编写

     

    单页面开发和组件化开发

    组件化开发:
    类似于DTL中的include,每一个组件的内容都可以被替换和复用
       
    单页面开发:  
    只需要1个页面,结合组件化开发来替换页面中的内容
    页面的切换只是组件的替换,页面还是只有1个index.html

    nodejs介绍

    1 javascript:只能运行在浏览器中,解释型语言,浏览器里有它的解释器
    2 谷歌的V8引擎,抠出来,运行在操作系统之上,c写了一些底层包
    3 nodejs:解释器,写javascript的代码
    4 前端工程师,不用学后端语言,只会js,就可以写后端了
    5 node:python,6 npm:pip3,用来安装第三方包​​
    ## 前端开发的ide
    - WebStorm 
         是JetBrains公司旗下一款JavaScript 开发工具。已经被广大中国JS开发者誉为“Web前端开发神器”
        “最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。
    
    - VS code
        Visual Studio Code(简称“VS Code”)是Microsoft在2015年4月30日Build开发者大会上正式宣布一个运行于 Mac OS X、Windows
      和 Linux 之上的,针对于编写现代Web和云应用的跨平台源代码编辑器,可在桌面上运行,并且可用于Windows,macOS和Linux。它具有对
      JavaScript,TypeScript和Node.js的内置支持,并具有丰富的其他语言(例如C++,C#,Java,Python,PHP,Go)和运行时(
      例如.NET和Unity)扩展的生态系统。 - HBuilder HBuilder是DCloud(数字天堂)推出的一款支持HTML5的Web开发IDE。 [1] HBuilder的编写用到了Java、C、Web和Ruby。
       HBuilder本身主体是由Java编写。 - Sublime Text Sublime Text 是一个文本编辑器(收费软件,可以无限期试用,但是会有激活提示弹窗),同时也是一个先进的代码编辑器。
       Sublime Text是由程序员Jon Skinner于2008年1月份所开发出来,它最初被设计为一个具有丰富扩展功能的Vim。Sublime Text具
       有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text的主
       要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨
       平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。 ​ ​ ## 我们开发用pycharm - webstorm和pycharm是一家,只需要装vue插件

    模板语法

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>插值语法</title>
        <script src="./js/vue.js"></script>
    </head>
    <body><div id="app">
        <h1>字符串:{{ name }}</h1>
        <h1>数值:{{ age }}</h1>
        <h2>数组:{{ name_list }}</h2>
        <h3>对象:{{ person_info }}</h3>
        <h4>{{ link }}</h4>
        <h4>对象取值:{{ person_info.age }}</h4>
        <h4>数组取值:{{ name_list[1] }}</h4>
        <h4>运算:{{ 10+20+30 }}</h4>
        <h4>三元运算:{{ 10>20?'是':'否' }}</h4></div>
    ​
    ​
    </body>
    <script>
        var vm = new Vue({
            el: "#app",
            data: {
                name: 'geng',  //字符串
                age:18, //数值
                name_list: ['刘一', '陈二', '张三', '李四', '王五', '赵六'], //对象
                person_info:{name:'geng',age:18},
                link:'<a href="http://www.baidu.com">点我</a>'
            }
        });
    </script>
    </html>

    指令

    文本指令,事件指令

    文本指令:
    v-text   标签内容显示js变量对应的值
    v-html   让HTML渲染成页面
    v-if     放1个布尔值:为真 标签就显示;为假 标签就不显示
    v-show   放1个布尔值:为真 标签就显示;为假 标签就不显示
    ​
    v-show与 v-if的区别:
    v-show:标签还在,只是不显示了(display: none)
    v-if:直接操作DOM,删除/插入 标签

    事件指令:
    v-on:缩写成@
    v-on:click='函数'
    @click='函数'
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>指令</title>
        <script src="js/vue.js"></script>
    </head>
    <body><div id="app">
        <h1 v-html="link"></h1>
        <h1 v-text="name"></h1>
        <h1 v-text="link"></h1>
        <h1></h1><button @click="handleClick">若隐若现</button>
        <div v-show="show">
            <h2>我只要你一滴泪的时间,听你形容他狠心的脸</h2>
        </div>
    ​
    ​
        <button @click="handle1">点我</button>
        <div v-if="if_show">
            <h2>那些快乐的梦都变丑了,你看不见吗</h2>
        </div><div></div>
    </div>
    </body>
    <script>
        var vm = new Vue({
            el: "#app",
            data: {
                name: 'geng',
                link: '<a href="http://www.baidu.com">点我</a>',
                show: true,
                if_show: true
            },
            methods: {
                handleClick() {
                    this.show = !this.show
                },
                handle1() {
                    this.if_show = !this.if_show
                }
            }
        })
    </script>
    </html>

    属性指令

    v-bind:src/href/name/='变量'
     缩写成
    :src='变量'
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script src="js/vue.js"></script>
        <style>
            .red{
                background-color: red;
            }
            .purple{
                background-color: aquamarine;
            }
        </style>
    </head>
    <body>
    <div id="app">
            <h1><a v-bind:href="link">点我看美女</a></h1>
        <br>
            <img :src="img" alt=""><div :class="isActive?'red':'purple'">
            <h1>快乐的一只小青蛙</h1>
        </div></div>
    </body>
    <script>
        var vm = new Vue({
            el:'#app',
            data:{
                name:'lqz',
                isActive:false,
                link:'http://www.cnblogs.com',
                img:'https://tva1.sinaimg.cn/large/00831rSTly1gcy7m2g0j9j310q0gqjtv.jpg',
            }
        })
    </script>
    </html>

    style和class的使用

    #js数组操作,增加值,修改值,删除值,vue的页面都会变
    数据的绑定
    语法
    :属性名=js变量/js语法
    ​
    :class=’js变量、字符串、js数组’
    class:三目运算符、数组、对象{red: true}
    ​
    :style=’js变量、字符串、js数组’
    style:三目运算符、数组[{backgreound: ‘red’},]、对象{background: ‘red’}

    可以检测到变动的数组页面也跟着编号的操作:

    push:最后位置添加
    
    pop:最后位置删除
    
    shift:第一个位置删除
    
    unshift:第一个位置添加
    
    splice:切片
    
    sort:排序
    
    reverse:反转

    检测不到变动的数组页面不变化的操作:

    filter():过滤
    
    concat():追加另一个数组
    
    slice():
    
    map():
    
    原因:
    
    作者重写了相关方法(只重写了一部分方法,但是还有另一部分没有重写)
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script src="js/vue.js"></script>
        <style>
            .red{
                background-color: red;
            }
            .purple{
                background-color: aquamarine;
            }
            .font_1{
                font-size: 30px;
            }
        </style>
    </head>
    <body>
    <div id="app">
        <div :class="class_obj">
            <h1>快乐的一只小青蛙</h1>
        </div>
        <br>
        <div :style="style_obj">
            <h1>忧伤的一只小克马</h1>
        </div>
        <br>
        <button @click="handle">点击变大</button>
    </div>
    </body>
    <script>
        var vm = new Vue({
            el:'#app',
            data:{
                // class_obj:'purple'
                // class_obj:['red','font_1']
                // class_obj:{red:true,font_1:false}
                // style_obj:'red'
                style_obj: [{background:'green'},{fontSize:'10px'}]
                // style_obj: {background:'blue',fontSize:'20px'}
            },
            methods:{
                handle(){
                    this.style_obj.fontSize='90px'
                }
            }
    ​
        })
    </script>
    </html>

    条件渲染

    指令        释义
    v-if       相当于: if
    v-else      相当于:else
    v-else-if   相当于:else if
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script src="./js/vue.js"></script>
        <style></style>
    </head>
    <body>
    <div id="app">
        <div v-if="a=='A'">A</div>
        <div v-else-if="a=='B'">B</div>
        <div v-else>其他</div>
    </div>
    </body><script>
        var vm = new Vue({
            el: '#app',
            data: {
                a:'A'
            },
            methods: {
                handle() {
                    this.style_obj.fontSize = '90px'
                }
            }
        })
    </script>
    </html>

    列表渲染(购物车)

    v-if+v-for+v-else控制购物车商品的显示

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
        <script src="js/vue.js"></script>
    </head>
    <body>
    <div id="app">
    <div class="col-md-6 col-md-offset-3">
        <div class="panel panel-primary">
                <button @click="handld">点我加载数据</button>
                <hr>
                <table class="table table-condensed" v-if="!goods.length==0">
                    <thead>
                    <tr>
                        <th>商品名字</th>
                        <th>价格</th>
                        <th>数量</th>
                    </tr>
                    </thead>
                    <tbody>
                    <tr v-for="good in goods">
                        <td class="info">{{good.name}}</td>
                        <td class="success">{{good.price}}</td>
                        <td class="warning">{{good.count}}</td>
                    </tr>
                    </tbody>
                </table>
                <div v-else>
                    啥也没有
                </div>
        </div>
    </div>
    </div>
    </body>
    <script>
        var vm = new Vue({
            el: '#app',
            data: {
                goods: []
            },
            methods: {
                handld() {
                    //去后台加载数据
                    this.goods = [{name: '特斯拉', price: 10000, count: 1}, {name: '包子', price: 3, count: 10}, {name: '花卷', price: 5, count: 12}]
                }
            }
        })
    </script>
    </html>
    View Code

    v-for遍历数组(列表)、对象(字典)、数字

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
        <script src="js/vue.js"></script>
    </head>
    <body>
    <div id="app">
        <h1>循环数组</h1>
        <ul class="list-group"><li class="list-group-item" v-for="(value,index) in list">第{{index}}个人-----名字是:{{value}}</li></ul>
        <br>
        <h1>循环对象</h1>
        <ul class="list-group"><li class="list-group-item" v-for="o in obj">{{o}}</li></ul>
         <ul class="list-group"><li class="list-group-item" v-for="(value,key) in obj">key是:{{key}}《---》value是:{{value}}</li></ul>
    </div>
    </body>
    <script>
        var vm = new Vue({
            el: '#app',
            data: {
                list: ['张三', '李四', '王五', '赵六'],
                obj: {name: 'lqz', age: '18', sex: ''}
    ​
            }
        })
    </script>
    </html>
    View Code

    事件处理

     事件    
               释义
    input
    当输入框进行输入的时候 触发的事件
    change
     当元素的值发生改变时 触发的事件
    blur
    当输入框失去焦点的时候 触发的事件

    过滤案件

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script src="./js/vue.js"></script>
        <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet">
        <style></style>
    </head>
    <body>
    <div class="container-fluid">
        <div class="row">
            <div class="col-lg-6 col-md-offset-3"><div id="app">
                    <!--                <input type="text" v-model="name" placeholder="光标移开触发-blur" v-on:blur="handle_blur">-->
                    <!--                <input type="text" v-model="name" placeholder="请输入要搜索的内容-change" v-on:change="handle_change">-->
    <!--                <input type="text" v-model="name" placeholder="请输入要搜索的内容-input" v-on:input="handle_input">-->
                    <input type="text" v-model="name" placeholder="请输入要搜索的内容-input" @input="handle_input">
                    <ul>
                        <li v-for="l in list">{{l}}</li>
                    </ul></div></div></div>
    ​
    ​
    </div>
    ​
    ​
    </body><script>
    ​
    ​
        var vm = new Vue({
            el: '#app',
            data: {
                name: '',
                list_old: ['a', 'atm', 'atmtw', 'atmtwxx', 'b', 'body', 'bodyxx', 'tm', 'm'],
                list: ['a', 'atm', 'atmtw', 'atmtwxx', 'b', 'body', 'bodyxx', 'tm', 'm']
            },
            methods: {
                handle_input() {
                    //只要输入框文字发生变化,就会触发它
                    //根据输入的值,过滤list
                    // let _this=this
                    // this.list.filter(function (item) {
                    //     console.log(_this.list_old)
                    //
                    // })
    ​
    ​
                    this.list = this.list_old.filter(item => {
                        if (item.indexOf(this.name) > -1) {
                            return true
                        } else {
                            return false
                        }
    ​
                    })
    ​
                },
                handle_change() {
                    console.log('change')
                    console.log(this.name)
                },
                handle_blur() {
                    console.log('blur')
                    console.log(this.name)
                },
            }
    ​
    ​
        })
    ​
        // let list = ['a', 'atm', 'atmtw', 'atmtwxx', 'b', 'body', 'bodyxx', 'tm', 'm']
    // let list_new=list.filter(function (item) {
        //     if(item.length>=3){
        //         return true
        //     }else{
        //         return false
        //     }
        //
        // })
        //箭头函数---es6的语法
        // let list_new = list.filter(item => {
        //     if (item.length >= 3) {
        //         return true
        //     } else {
        //         return false
        //     }
        // })
        // console.log(list_new)
        //
        //
        // var a = (data, a) => {
        //
        // }
        // var b = function (data, a) {
        //
        //
        // }
    ​
    ​
        let a='efy'
        let str_a='abcdefg'
        console.log(str_a.indexOf(a))
    ​
    </script></html>
    View Code

    事件修饰符

    事件修饰符             
                   释义
    .stop
    只处理自己的事件,父控件冒泡的事件不处理(阻止事件冒泡)
    .self
    只处理自己的事件,子控件冒泡的事件不处理
    .prevent
    阻止a链接的跳转
    .once
    事件只会触发一次(适用于抽奖页面)


    使用修饰符时,顺序很重要;相应的代码会以同样的顺序产生
    ​
    用 v-on:click.prevent.self 会阻止所有的点击
    而 v-on:click.self.prevent 只会阻止对元素自身的点击

    阻止事件冒泡

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script src="./js/vue.js"></script>
        <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet">
        <style></style>
    </head>
    <body>
    <div class="container-fluid">
        <div class="row">
            <div class="col-lg-6 col-md-offset-3"><div id="app">
                    <div v-on:click="div_click">
                        <button @click.stop="button_click">点我看美女</button>
                    </div><hr>
                    <div v-on:click.self="div_click">
                        <button @click="button_click">点我看美女2</button>
                        <span>dadfafdasdfadsf</span></div>
    ​
    ​
                    <hr>
                    <a href="http://www.baidu.com" @click.prevent="handle_a">点我看没办</a><hr>
                    <button @click.once="handle_one">我只能点一次</button>
                </div></div></div>
    ​
    ​
    </div>
    ​
    ​
    </body><script>
    ​
    ​
        var vm = new Vue({
            el: '#app',
            data: {},
            methods: {
                div_click() {
                    alert('div被点击了')
                },
                button_click() {
                    alert('button被点击了')
                },
                handle_a(){
                    alert('a链接跳转阻挡了')
                    location.href='http://www.baidu.com'
                },
                handle_one(){
                    alert('我只会谈一次')
                }
            }
    ​
    ​
        })
    ​
    </script></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">
    <!--    <input type="text" @keyup.enter="handle" v-model="search">-->
    <!--    <input type="text" @keyup="handle" v-model="search">-->
        <input type="text" @keydown="handle" v-model="search"></div>
    </body><script>var vm = new Vue({
            el: '#app',
            data: {
                search:''
            },
            methods: {
                handle(){
                    console.log('enter建被放开了')
                    location.href='https://www.baidu.com/s?wd='+this.search
                }
            }
        })
    </script></html>

    数据双向绑定

    v-model的使用

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
        <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
        <script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
        <script src="./js/vue.js"></script>
    </head>
    <body>
    <div id="box">
        <div class="container-fluid">
            <div class="row">
                <div class="col-md-6 col-md-offset-3">
                    <div class="input-group">
                        <label for="name">用户名</label>
                        <!-- v-model数据的双向绑定,只针对input的属性 -->
                        <input class="form-control" type="text" v-model="name">
                    </div>
                    <div class="input-group">
                        <label for="password">密码</label>
                        <input class="form-control" type="password" v-model="password"><span>{{error}}</span>
                    </div>
                    <hr>
                    您输入的名字是:{{name}}
                    <hr>
                    <button @click="submit_1">登录</button>
                </div>
            </div>
        </div>
    </div>
    </body>
    <script>
        var vm = new Vue({
            el: '#box',
            data: {
                name: '',
                password: '',
                error: '',
            },
            methods: {
                submit_1() {
                    if (this.name == 'lqz' && this.password == '123') {
                        location.href = 'http://www.baidu.com'
                    } else {
                        this.error = '用户名或密码错误'
                    }
                }
            }
        })
    </script>
    </html>

    表单控制

    checkbox选中

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
        <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
        <script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
        <script src="./js/vue.js"></script>
    </head>
    <body>
    <div id="box">
        <div class="container-fluid">
            <div class="row">
                <div class="col-md-6 col-md-offset-3">
                    <div class="input-group">
                        <label for="name">用户名</label>
                        <!-- v-model数据的双向绑定,只针对input的属性 -->
                        <input class="form-control" type="text" v-model="name" placeholder="请输入用户名">
                    </div>
                    <div class="input-group">
                        <label for="password">密码</label>
                        <input class="form-control" type="password" v-model="password" placeholder="请输入密码">
                    </div>
                    <hr>
                    您输入的名字是:{{name}}
                    <hr>
                     <div class="input-group">
                         <label>记住密码:</label>
                         <input type="checkbox" v-model="check_1">
                         <input type="checkbox" v-model="radio_1">
                    </div>
                </div>
            </div>
        </div>
    </div>
    </body>
    <script>
        var vm = new Vue({
            el: '#box',
            data: {
                name: '',
                password: '',
                checkbox_1: false,
                radio_1:false,
            },
        })
    </script>
    </html>

    单选,多选

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
        <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
        <script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
        <script src="./js/vue.js"></script>
    </head>
    <body>
    <div id="box">
        <div class="container-fluid">
            <div class="row">
                <div class="col-md-6 col-md-offset-3">
                    <div class="input-group">
                        <label for="name">用户名</label>
                        <!-- v-model数据的双向绑定,只针对input的属性 -->
                        <input class="form-control" type="text" v-model="name" placeholder="请输入用户名">
                    </div>
                    <div class="input-group">
                        <label for="password">密码</label>
                        <input class="form-control" type="password" v-model="password" placeholder="请输入密码">
                    </div>
                    <h4>单选</h4>
                    <div class="input-group">
                        <input type="radio" v-model="sex" value="男"><input type="radio" v-model="sex" value="女"><input type="radio" v-model="sex" value="未知">未知
                        <br><br>您的性别:{{sex}}
                    </div>
                    <hr>
                     <h4>多选</h4>
                    <div class="input-group">
                        <input type="checkbox" v-model="hobby" value="篮球">篮球
                        <input type="checkbox" v-model="hobby" value="足球">足球
                        <input type="checkbox" v-model="hobby" value="桌球">桌球
                        <input type="checkbox" v-model="hobby" value="棒球">棒球
                        <input type="checkbox" v-model="hobby" value="羽毛球">羽毛球
                        <input type="checkbox" v-model="hobby" value="乒乓球">乒乓球
                        <input type="checkbox" v-model="hobby" value="双色球">双色球
                        <br><br>您喜欢的球类:{{hobby}}
                    </div>
                </div>
            </div>
        </div>
    </div>
    </div>
    </body>
    <script>
        var vm = new Vue({
            el: '#box',
            data: {
                name: '',
                password: '',
                sex: '',
                hobby:[],
            },
        })
    </script>
    </html>

    购物车案例

    基础-结算

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>基本购物车计算商品价格</title>
        <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
        <script src="./js/vue.js"></script>
    </head>
    <body>
    <div id="box">
        <div class="container-fluid">
            <div class="row">
                <h2 class="text-center">购物车</h2>
                <div class="col-md-6 col-md-offset-3">
                    <table class="table table-condensed text-center">
                        <tr>
                            <td class="active">图片</td>
                            <td class="success">名称</td>
                            <td class="info">价格</td>
                            <td class="danger">数量</td>
                            <td class="warning">选择</td>
                        </tr>
                        <tr v-for="good in goods">
                            <td class="info"><img :src="good.img" alt="" width="40px" height="30px"></td>
                            <td class="danger">{{good.name}}</td>
                            <td class="warning">{{good.price}}</td>
                            <td class="success">{{good.count}}</td>
                            <!-- v-model绑定数据,value绑定商品对象 @change选中没选中都触发事件-->
                            <td class="active"><input type="checkbox" v-model="checkGroup" :value="good" @change="sumPrice"></td></tr>
                    </table>
                    选中的商品:{{checkGroup}}
                    <br>
                    总价格:{{sumPrice()}}
                </div>
            </div>
        </div>
    </div>
    </body>
    <script>
        var vm = new Vue({
            el: '#box',
            data: {
                goods: [
                    {id: 1, name: '汉堡', price: 16, count: 1, img: './img/hanbao.jpg'},
                    {id: 1, name: '鸡肉卷', price: 10, count: 1, img: './img/jiroujuan.jpg'},
                    {id: 1, name: '炸鸡', price: 28, count: 1, img: './img/zhaji.jpg'},
                    {id: 1, name: '啤酒', price: 8, count: 1, img: './img/pijiu.jpg'},
                    {id: 1, name: '可乐', price: 6, count: 1, img: './img/kele.jpg'},],
                checkGroup:[],
                // totalPrice:0 方式一需要在全局定义
            },
    ​
            methods: {
                // 方式一
                     // sumPrice(){
                //     this.totalPrice=0 //先置0再去改
                //     for (i in this.checkGroup){ // 这里的 i 是索引,每次根据索引取值
                //         this.totalPrice+=this.checkGroup[i].price*this.checkGroup[i].count
                //
                //     }
                //
                // }
                // 方式二
                // 函数内使用的vue中的变量,只要发生变化,函数会重新运算
                sumPrice(){
                    let totalPrice = 0
                    // for (i=0;i<this.checkGroup.length;i++){//索引循环
                    for (i in this.checkGroup){ //迭代循环,在Vue当中是取值,在JS中第一个值是索引
                                      //只要checkGroup发生变化,就会重新运算,totalPrice也就跟着变化
                        totalPrice += this.checkGroup[i].price * this.checkGroup[i].count
                    }
                    return totalPrice
                }
            },
        })
    </script>
    </html>
     

    进阶-全选/全不选

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>基本购物车计算商品价格</title>
        <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
        <script src="./js/vue.js"></script>
    </head>
    <body>
    <div id="box">
        <div class="container-fluid">
            <div class="row">
                <h2 class="text-center">购物车</h2>
                <div class="col-md-6 col-md-offset-3">
                    <table class="table table-condensed text-center">
                        <tr>
                            <td class="active">图片</td>
                            <td class="success">名称</td>
                            <td class="info">价格</td>
                            <td class="danger">数量</td>
                            <td class="warning">全选/不全选
                                <input type="checkbox" v-model="checkAll" @change="handleCheckAll">
                            </td>
                        </tr>
                        <tr v-for="good in goods">
                            <td class="info"><img :src="good.img" alt="" width="40px" height="30px"></td>
                            <td class="danger">{{good.name}}</td>
                            <td class="warning">{{good.price}}</td>
                            <td class="success">{{good.count}}</td>
                            <td class="active"><input type="checkbox" v-model="checkGroup" :value="good" @change="checkOne"></td></tr>
                    </table>
                    选中的商品:{{checkGroup}}
                    <br>
                    总价格:{{sumPrice()}}
                </div>
            </div>
        </div>
    </div>
    </body>
    <script>
        var vm = new Vue({
            el: '#box',
            data: {
                goods: [
                    {id: 1, name: '汉堡', price: 16, count: 1, img: './img/hanbao.jpg'},
                    {id: 1, name: '鸡肉卷', price: 10, count: 1, img: './img/jiroujuan.jpg'},
                    {id: 1, name: '炸鸡', price: 28, count: 1, img: './img/zhaji.jpg'},
                    {id: 1, name: '啤酒', price: 8, count: 1, img: './img/pijiu.jpg'},
                    {id: 1, name: '可乐', price: 6, count: 1, img: './img/kele.jpg'},],
                checkGroup:[],
            },
    ​
            methods: {
                sumPrice(){
                    let totalPrice = 0
                    for (i in this.checkGroup){ //迭代循环
                        totalPrice += this.checkGroup[i].price * this.checkGroup[i].count
                    }
                    return totalPrice
                },
                handleCheckAll(){
                    // 选中的长度等于所有商品长度
                    if (this.checkGroup.length == this.goods.length){
                        this.checkGroup = [] //说明已经全选了,再点击就置空
                        this.checkAll = false  // 全不选按钮就是不选中状态
                    }else {
                        this.checkGroup = this.goods  // 没有全选点击就全选
                        this.checkAll = true // 全选按钮就是就是选中状态
                    }
                },
                checkOne(){
                    // 选中的长度不等于所有商品长度
                    if (this.checkGroup.length != this.goods.length){
                        this.checkAll = false // 全选按钮就是不选中状态
                    }else {
                        this.checkAll = true // 否则全选按钮就是选中状态
                    }
                }
            },
        })
    </script>
    </html>

    高级-带加减

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>基本购物车计算商品价格</title>
        <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
        <script src="./js/vue.js"></script>
    </head>
    <body>
    <div id="box">
        <div class="container-fluid">
            <div class="row">
                <h2 class="text-center">购物车</h2>
                <div class="col-md-6 col-md-offset-3">
                    <table class="table table-condensed text-center">
                        <tr>
                            <td class="active">图片</td>
                            <td class="success">名称</td>
                            <td class="info">价格</td>
                            <td class="danger">数量</td>
                            <td class="warning">全选/不全选
                                <input type="checkbox" v-model="checkAll" @change="handleCheckAll">
                            </td>
                        </tr>
                        <tr v-for="good in goods">
                            <td class="info"><img :src="good.img" alt="" width="40px" height="30px"></td>
                            <td class="danger">{{good.name}}</td>
                            <td class="warning">{{good.price}}</td>
                            <td class="success">
                                <button @click="good.count++">+</button>
                                {{good.count}}
                                <button @click="subtract(good)">-</button>
                            </td>
                            <td class="active"><input type="checkbox" v-model="checkGroup" :value="good" @change="checkOne">
                            </td></tr>
                    </table>
                    选中的商品:{{checkGroup}}
                    <br>
                    总价格:{{sumPrice()}}
                </div>
            </div>
        </div>
    </div>
    </body>
    <script>
        var vm = new Vue({
            el: '#box',
            data: {
                goods: [
                    {id: 1, name: '汉堡', price: 16, count: 1, img: './img/hanbao.jpg'},
                    {id: 1, name: '鸡肉卷', price: 10, count: 1, img: './img/jiroujuan.jpg'},
                    {id: 1, name: '炸鸡', price: 28, count: 1, img: './img/zhaji.jpg'},
                    {id: 1, name: '啤酒', price: 8, count: 1, img: './img/pijiu.jpg'},
                    {id: 1, name: '可乐', price: 6, count: 1, img: './img/kele.jpg'},],
                checkGroup: [],
            },
    ​
            methods: {
                sumPrice() {
                    let totalPrice = 0
                    for (i in this.checkGroup) { //迭代循环
                        totalPrice += this.checkGroup[i].price * this.checkGroup[i].count
                    }
                    return totalPrice
                },
                handleCheckAll() {
                    // 选中的长度等于所有商品长度
                    if (this.checkGroup.length == this.goods.length) {
                        this.checkGroup = [] //说明已经全选了,再点击就置空
                        this.checkAll = false  // 全选按钮就是不选中状态
                    } else {
                        this.checkGroup = this.goods  // 没有全选点击就全选
                        this.checkAll = true // 全选按钮 
                        就是  280就是选中状态
                    }
                },
                checkOne() {
                    // 选中的长度不等于所有商品长度
                    if (this.checkGroup.length != this.goods.length) {
                        this.checkAll = false // 全选按钮就是不选中状态
                    } else {
                        this.checkAll = true // 否则全选按钮就是选中状态
                    }
                },
                subtract(good){
                    if (good.count == 1){
                        good.count == 1
                    }else {
                        good.count--
                    }
                }
            }
        })
    </script>
    </html>

    v-model 进阶

    v-model 之 lazy、number、trim

    lazy:等待input框的数据绑定时区焦点之后再变化

    number:数字开头,只保留数字,后面的字母不保留;字母开头,都保留

    trim:去除首尾的空格

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
        <script src="./js/vue.js"></script>
    </head>
    <body>
    <div id="box">
        <div class="container-fluid">
            <div class="row">
                <div class="col-md-6 col-md-offset-3">
                     <div class="input-group">
                        <label>用户名:</label>
                        <input class="form-control" type="text" v-model="name" placeholder="native"></div>
                    {{name}}
                    <br>
                    <div class="input-group">
                        <label >等待input框的数据绑定时区焦点之后再变化:</label>
                        <input class="form-control" type="text" v-model.lazy="name1" placeholder="lazy"></div>
                    <br>
                     {{name1}}
                     <hr>
                     <br>
                    <div class="input-group">
                        <label >数字开头,只保留数字,后面的字母不保留;字母开头,都保留:</label>
                        <input class="form-control" type="text" v-model.number="name2" placeholder="number"></div>
                     <br>
                     {{name2}}
                     <hr>
                    <div class="input-group">
                        <label>去除首尾的空格:</label>
                        <input class="form-control" type="text" v-model.trim="name3" placeholder="trim">
                    </div>
                   <br>
                     {{name3}}
                     <hr>
                </div>
            </div>
        </div>
    </div>
    </body>
    <script>
        var vm = new Vue({
            el: '#box',
            data: {
                name: '',
                name1: '',
                name2: '',
                name3: '',
            },
        })
    </script>
    </html>
    
    
    从来就没有正确的选择,我们只不过是要努力奋斗,使当初的选择变得正确。
  • 相关阅读:
    Quicksum -SilverN
    uva 140 bandwidth (好题) ——yhx
    uva 129 krypton factors ——yhx
    uva 524 prime ring problem——yhx
    uva 10976 fractions again(水题)——yhx
    uva 11059 maximum product(水题)——yhx
    uva 725 division(水题)——yhx
    uva 11853 paintball(好题)——yhx
    uva 1599 ideal path(好题)——yhx
    uva 1572 self-assembly ——yhx
  • 原文地址:https://www.cnblogs.com/gfeng/p/14747697.html
Copyright © 2011-2022 走看看