zoukankan      html  css  js  c++  java
  • vue 笔记基础

    01. 什么是Vue.js
    02. 从demo1开始
    03. 条件与循环
    04. 处理用户输入
    05. 按钮事件
    06. 组件
    07. 过滤器
    08. 计算属性
    09. 观察属性
    10. 设定机算属性
    11. Class绑定
    12. Class对象绑定
    13. 条件渲染
    14. 元素显示v-show
    15. 列表渲染
    16. JS对象迭代
    17. 事件处理器
    18. 表单控件v-model绑定
    19. 表单复选框
    20. 表单单选按钮
    21. 表单下拉框
    22. 表单修饰符
    23. 组件:基础的基础
    24. 组件:局部的组件
    25. 组件:表行组件
    26. 组件:数据
    27. 组件:传递数据
    28. 组件:传递变量
    29. 组件:参数验证
    30. 组件:事件传递
    31. 组件:slot插槽
    32. 组件:组合slot
    33. 其他指令,v-text
    34. 其他指令,v-html
    35. v-on补充
    36. axios加vue远程调用

    1.什么是vue?

    Vue.js 就是一个MVVM的实现者,他的核心就是实现了DOM监听与数据
    Model : 模型层,在这里表示JavaScript对象 View : 视图层,在这里表示DOM (HTML操作的元素) ViewModel : 连接视图和数据的中间件,Vue.js就是MVVM中的ViewModel层的实现者在MVVM架构中,是不允许数据和视图直接通信的,只能通过ViewModel来通信,而ViewModel就是定义了一个Observer观察 ViewModel 能够观察到数据的变化,并对视图对应的内容进行更新 ViewModel 能够监听到视图的变化,并能够通知数据发生改变
    什么是MVVM
        MVVM (Model-View-ViewModel) 是一种软件架构设计模式,由微软WPF (用于替代WinForm,以前就是用这个技术开发桌面应用程序的)
    和Silverlight (类似于Java Applet,简单点说就是在浏览器上运行的WPF)的架构师Ken Cooper和Ted Peters 开发,是一种简化用户界面的事件驱动编程方式。
    由John Gossman (同样也是WPF和Silverlight的架构师)于2005年在他的博客上发表。 MVVM的核心是ViewModel层,负责转换Model中的数据对象来让数据变得更容易管理和使用,其作用如下: ○ 该层向上与视图层进行双向数据绑定 ○ 向下与Model层通过接口请求进行数据交互 目的是分离视图(View)和模型(Model),有几大好处: ○ 低耦合:视图(View)可以独立于Model变化和修改,一个ViewModel可以绑定到不同的 ○ View上,当View变化的时候Model可以不变,当Model变化的时候View也可以不变。 ○ 可复用:你可以把一些视图逻辑放在一个ViewModel里面,让很多View重用这段视图逻辑。 ○ 独立开发:开发人员可以专注于业务逻辑和数据的开发(ViewModel),设计人员可以专注于页面设计。 ○ 可测试:界面素来是比较难于测试的,而现在测试可以针对ViewModel来写。

    Vue 是 MVVM 模式的实现者

             

    2.demo1

    el : 挂载点
        el的作用?
        el是用来设置Vue实例挂载(管理)到那个元素
        Vue实例的作用范围是什么?*
        Vue会管理el选项命中的元素及其内部的后代元素
        是否可以使用其他的选择器?
        可以使用其他的选择器,但建议使用ID选择器
        是否可以设置其他的dom元素呢?
        可以使用其他的双标签,不能使用 HTML 和 BODY

      data:数据对象
        1、Vue中用到的数据定义在data中
        2、data中可以写复杂类型的数据
        3、渲染复杂类型数据时,遵守js的语法即可

    //style.css
    body { font-size: 24px; } button { 80px; height: 45px; font-size: 20px; } .active { color: red; } .big { font-weight: bolder; font-size: 64px; } .border1 { border: 1px solid gray; }

     渲染data中的数据到页面上

    <!DOCTYPE html>
    <html lang="zh">
    
    <head>
        <title></title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <script src="https://unpkg.com/vue/dist/vue.js"></script>
        <link href="../css/style.css" rel="stylesheet">
    </head>
    
    <body>
    <div id="myApp"> {{ message10 }}</div>
    <script>
        var myApp = new Vue({
            el: '#myApp',
            data: {
                message10: 'Hello Vue.js World!'
            }
        });
    </script>
    </body>
    
    </html>

    3.v-for遍历data数据

    1、v-for指令的作用是:根据数据生成的列表结构
    2、数组经常和v-for结合使用
    3、语法(item,index)in 数据
    4、item和index可以结合其他指令一起使用
    5、数组长度的更新会同步到页面上,是响应式的
    <!DOCTYPE html> <html lang="zh"> <head> <title></title> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <script src="https://unpkg.com/vue/dist/vue.js"></script> <link href="../css/style.css" rel="stylesheet"> </head> <body> <div id="myApp"> <h3>游戏列表</h3> <!-- Virtual DOM --> <div v-if="seen">2017最新发卖</div> <ol> <li v-for="game in games">{{game.title}} / {{game.price}}元</li> </ol> </div> <script> var myApp = new Vue({ el: '#myApp', data: { seen: true, games: [ { title: '勇者斗恶龙', price: 400 }, { title: '超级马里奥', price: 380 }, { title: '我的世界', price: 99 }, ], }, }); </script> </body> </html>

    4.处理用户输入

    <!DOCTYPE html>
    <html lang="zh">
    
    <head>
        <title></title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <script src="https://unpkg.com/vue/dist/vue.js"></script>
        <link href="../css/style.css" rel="stylesheet"> </head>
    
    <body>
    <div id="myApp">
        <p>您最喜欢的游戏是:{{mygame}}</p>
        <input v-model="mygame">
    </div>
    <script>
        var myApp = new Vue({
            el: '#myApp',
            data: {
                mygame: '超级马里奥GTA'
            },
        });
    </script>
    </body>
    
    </html>

    5.v-on事件绑定和传参

    1、作用:为元素绑定事件
    2、事件名不需要写on
    3、指令可以简写@
    4、绑定的方法定义在methods属性中
    5、方法的内部通过this关键字可以访问定义data中的数据

    <!DOCTYPE html>
    <html lang="zh">
    
    <head>
        <title></title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <script src="https://unpkg.com/vue/dist/vue.js"></script>
        <link href="../css/style.css" rel="stylesheet"> </head>
    
    <body>
    <div id="myApp">
        <p>您最喜欢的游戏是:{{mygame}}</p>
        <button v-on:click="btnClick('我的世界')">我的世界</button>
        <button v-on:click="btnClick('勇者斗恶龙')">勇者斗恶龙</button>
        <button v-on:click="btnClick('塞尔达传说')">塞尔达传说</button>
        <button @click="btnClick('魔界战记5')">魔界战记5</button>
    </div>
    <script>
        var myApp = new Vue({
            el: '#myApp',
            data: {
                mygame: '超级马里奥'
            },
            methods: {
                btnClick: function(pname){
                    this.mygame = pname;
                },
            },
        });
    </script>
    </body>
    
    </html>

    6.初次接触组件component,遍历动态引用组件

    <!DOCTYPE html>
    <html lang="zh">
    
    <head>
        <title></title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <script src="https://unpkg.com/vue/dist/vue.js"></script>
        <link href="../css/style.css" rel="stylesheet"> </head>
    
    <body>
    <div id="myApp">
      <ol>
        <game-item v-for="item in games" v-bind:game="item"></game-item>
      </ol>
    </div>
    <script>
    /* 组件定义:game-item */
    Vue.component('game-item', {
      props: ['game'],
      template: '<li>{{ game.title }}</li>'
    });
    /* Vue对象实例化 */
    var myApp = new Vue({
      el: '#myApp',
      data: {
        games: [
          { title: '斗地主' },
          { title: '打麻雀' },
          { title: 'UNO' }
        ]
      }
    });
    </script>
    </body>
    
    </html>

    7.filters格式化数据

    <!DOCTYPE html>
    <html lang="zh">
    
    <head>
        <title></title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <script src="https://unpkg.com/vue/dist/vue.js"></script>
        <link href="../css/style.css" rel="stylesheet">
    </head>
    
    <body>
    <div id="myApp">
        <p>{{message}}</p>
        <p>{{message | toupper }}</p>
        <hr>
        <p>现在的vue.js学习进度是{{num}}({{num | topercentage}})。</p>
    </div>
    <script>
        var myApp = new Vue({
            el: '#myApp',
            data: {
                message: 'hello vue.js world.',
                num: 0.3
            },
            filters: {
                toupper: function (value) {
                    return value.toUpperCase();
                },
                topercentage: function (value) {
                    return value * 100 + '%';
                },
            },
        });
    </script>
    </body>
    
    </html>

     8.computed处理数据

    <!DOCTYPE html>
    <html lang="zh">
    
    <head>
        <title></title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <script src="https://unpkg.com/vue/dist/vue.js"></script>
        <link href="../css/style.css" rel="stylesheet">
    </head>
    
    <body>
    <div id="myApp">
        今年3月3日发卖的任天堂新一代主机Switch的价格是:{{price}}円,含税价格为:{{priceInTax}}円,折合人民币为:{{priceChinaRMB}}元。
    </div>
    <script>
        var myApp = new Vue({
            el: '#myApp',
            data: {
                price: 29980
            },
            computed: {
                priceInTax: function () {
                    return this.price * 1.08;
                },
                priceChinaRMB: function () {
                    return Math.round(this.priceInTax / 16.75);
                },
            },
        });
    </script>
    </body>
    
    </html>

     9.watch处理数据,和computed的区别后续补充

    <!DOCTYPE html>
    <html lang="zh">
    
    <head>
        <title></title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <script src="https://unpkg.com/vue/dist/vue.js"></script>
        <link href="../css/style.css" rel="stylesheet">
    </head>
    
    <body>
    <div id="myApp">
        <p>今年3月3日发卖的任天堂新一代主机Switch的价格是:{{price}}円,含税价格为:{{priceInTaxC}}円</p>
        <p>今年3月3日发卖的任天堂新一代主机Switch的价格是:{{price}}円,含税价格为:{{priceInTax}}円,折合人民币为:{{priceChinaRMB}}元。</p>
        <button @click="btnClick(10000)">加价10000円</button>
    </div>
    <script>
        var myApp = new Vue({
            el: '#myApp',
            data: {
                price: 0,
                priceInTax: 0,
                priceChinaRMB: 0,
            },
            computed: {
                priceInTaxC: function () {
                    return this.price * 1.08;
                },
            },
            watch: {
                price: function (newVal, oldVal) {
                    console.log(newVal, oldVal);
                    this.priceInTax = Math.round(this.price * 1.08);
                    this.priceChinaRMB = Math.round(this.priceInTax / 16.75);
                },
            },
            methods: {
                btnClick: function (newPrice) {
                    this.price += newPrice;
                },
            },
        });
        myApp.price = 29980;
    </script>
    </body>
    
    </html>

     10.computed设置计算属性,同步更新元数据的值

    <!DOCTYPE html>
    <html lang="zh">
    
    <head>
        <title></title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <script src="https://unpkg.com/vue/dist/vue.js"></script>
        <link href="../css/style.css" rel="stylesheet">
    </head>
    
    <body>
    <div id="myApp">
        <p>今年3月3日发卖的任天堂新一代主机Switch的价格是:{{price}}円,含税价格为:{{priceInTax}}円,折合人民币为:{{priceChinaRMB}}元。</p>
        <button @click="btnClick(10800)">把含税改价为10800円</button>
    </div>
    <script>
        var myApp = new Vue({
            el: '#myApp',
            data: {
                price: 29980
            },
            computed: {
                priceInTax: {
                    get: function () {
                        return this.price * 1.08;
                    },
                    set: function (value) {
                        this.price = value / 1.08;
                    }
                },
                priceChinaRMB: function () {
                    return Math.round(this.priceInTax / 16.75);
                },
            },
            methods: {
                btnClick: function (newPrice) {
                    this.priceInTax = newPrice;
                },
            },
        });
    </script>
    </body>
    
    </html>

     11.v-bind设置属性状态

    
    
    1、v-bind指令的作用是:为元素绑定属性
    2、完整写法是v-bind:属性名
    3、简写的话可以直接省略v-bind,只保留 :属性名
    4、需要动态的增删calss建议使用对象的方式
    <!DOCTYPE html> <html lang="zh"> <head> <title></title> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <script src="https://unpkg.com/vue/dist/vue.js"></script> <link href="../css/style.css" rel="stylesheet"> </head> <body> <div id="myApp"> <div v-bind:class="{active:isActive}">红色文本1</div> <div :class="{active:isActive}">红色文本2</div> <button @click="btnClick">改变class吧</button> </div> <script> var myApp = new Vue({ el: '#myApp', data: { isActive: true, }, methods: { btnClick: function () { this.isActive = !this.isActive; }, }, }); </script> </body> </html>
    12.v-bind设置属性状态,多属性
    <!DOCTYPE html>
    <html lang="zh">
    
    <head>
        <title></title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <script src="https://unpkg.com/vue/dist/vue.js"></script>
        <link href="../css/style.css" rel="stylesheet">
    </head>
    
    <body>
    <div id="myApp">
        <div :class="myClass">红色文本</div>
        <button @click="btnClick">改变class吧</button>
    </div>
    <script>
        var myApp = new Vue({
            el: '#myApp',
            data: {
                myClass: {
                    active: true,
                    big: true,
                },
            },
            methods: {
                btnClick: function () {
                    this.myClass.active = !this.myClass.active;
                    this.myClass.big = !this.myClass.big;
                },
            },
        });
    </script>
    </body>
    
    </html>

     13.v-if

    1、v-if指令的作用是:根据表达式的真假切换元素的显示状态
    2、本质是通过操作dom元素来切换显示状态
    3、表达式的值为true,元素存在于dom树中,为false,从dom树中移除
    4、频繁的切换使用v-show,反之使用v-if,前者的切换消耗小
    <!DOCTYPE html> <html lang="zh"> <head> <title></title> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <script src="https://unpkg.com/vue/dist/vue.js"></script> <link href="../css/style.css" rel="stylesheet"> </head> <body> <div id="myApp"> <h1 v-if="result == null">成绩未公布</h1> <h1 v-else-if="result < 60">{{result}}分 - 考试不及格</h1> <h1 v-else-if="result < 80">{{result}}分 - 还需努力</h1> <h1 v-else>{{result}}分 - 考得不错,玩游戏吧!</h1> <button @click="btnClick">考试成绩</button> </div> <script> var myApp = new Vue({ el: '#myApp', data: { result: null }, methods: { btnClick: function () { this.result = Math.round(Math.random() * 100); }, }, }); </script> </body> </html>

     14.v-show

    1.作用:根据真假切换元素的显示状态
    2.原理是修改元素的display,实现显示隐藏
    3.指令后面的内容,最终都会解析为布尔值
    4.值为true元素显示,值为false为隐藏
    5.数据改变之后,对应元素的显示状态会同步更新
    <!DOCTYPE html> <html lang="zh"> <head> <title></title> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <script src="https://unpkg.com/vue/dist/vue.js"></script> <link href="../css/style.css" rel="stylesheet"> </head> <body> <div id="myApp"> <h1 v-show="result">任天堂新一代主机Switch</h1> <button @click="btnClick">显示按钮</button> </div> <script> var myApp = new Vue({ el: '#myApp', data: { result: true }, methods: { btnClick: function(){ this.result = !this.result; }, }, }); </script> </body> </html>

    15.再与v-for

    <!DOCTYPE html>
    <html lang="zh">
    
    <head>
        <title></title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <script src="https://unpkg.com/vue/dist/vue.js"></script>
        <link href="../css/style.css" rel="stylesheet">
    </head>
    
    <body>
    <div id="myApp">
        <ol>
            <li v-for="(game, index) in games">({{index + 1}}) {{game.title}} / 售价:{{game.price}}元</li>
        </ol>
    </div>
    <script>
        var myApp = new Vue({
            el: '#myApp',
            data: {
                games: [
                    {title: "勇者斗恶龙", price: 500},
                    {title: "库跑卡丁车", price: 400},
                    {title: "马里奥世界", price: 550},
                ]
            },
        });
    </script>
    </body>
    
    </html>

    16.v-for jsdata

    <!DOCTYPE html>
    <html lang="zh">
    
    <head>
        <title></title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <script src="https://unpkg.com/vue/dist/vue.js"></script>
        <link href="../css/style.css" rel="stylesheet">
    </head>
    
    <body>
    <div id="myApp">
        <h1>JS对象迭代</h1>
        <div v-for="(value, key) in mygame">
            {{ key }} : {{ value }}
        </div>
    </div>
    <script>
        var myApp = new Vue({
            el: '#myApp',
            data: {
                mygame: {
                    title: "乌贼娘2代",
                    price: 350,
                    pubdate: "2017年夏季",
                    category: "射击",
                    agerange: "全年龄",
                },
            },
        });
    </script>
    </body>
    
    </html>

     17.v-on事件

    1、作用:为元素绑定事件
    2、事件名不需要写on
    3、指令可以简写@
    4、绑定的方法定义在methods属性中
    5、方法的内部通过this关键字可以访问定义data中的数据
    <!DOCTYPE html> <html lang="zh"> <head> <title></title> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <script src="https://unpkg.com/vue/dist/vue.js"></script> <link href="../css/style.css" rel="stylesheet"> </head> <body> <div id="myApp"> <h1>事件处理器</h1> <input id="txtName" v-on:keyup="txtKeyup($event)"> <button id="btnOK" v-on:click="btnClick($event)">OK</button> </div> <script> var myApp = new Vue({ el: '#myApp', data: {}, methods: { txtKeyup: function (event) { this.debugLog(event); }, btnClick: function (event) { this.debugLog(event); }, debugLog: function (event) { console.log( event.srcElement.tagName, event.srcElement.id, event.srcElement.innerHTML, event.key ? event.key : "" ); }, }, }); </script> </body> </html>

     18.表单v-model

    1、v-model指令的作用是便捷的设置和获取表单元素的值
    2、绑定的数据会和表单元素值相关联
    3、绑定的数据←→表单元素的值
    你可以用v-model指令在表单 <input>、<textarea> 及<select> 元素上创建双向数据绑定。它会根据控件类型自动选取正确的方法来更新元素。
    尽管有些神奇,但v-model本质上不过是语法糖。它负责监听户的输入事件以更新数据,并对一些极端场景进行一些特殊处理。
    注意:v-model会忽略所有元素的value、checked、selected特性的初始值而总是将Vue实例的数据作为数据来源,你应该通过JavaScript在组件的data选项中声明。

    <!DOCTYPE html> <html lang="zh"> <head> <title></title> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <script src="https://unpkg.com/vue/dist/vue.js"></script> <link href="../css/style.css" rel="stylesheet"> </head> <body> <div id="myApp"> <h1>表单控件绑定</h1> <input type="text" v-model="message" placeholder="来呀,编辑我吧!"> <p>Message is: {{ message }}</p> <textarea v-model="message" placeholder="加入多行编辑" rows="8" cols="34"></textarea> </div> <script> var myApp = new Vue({ el: '#myApp', data: { message: "我爱马里奥", }, methods: {}, }); </script> </body> </html>

    19.checkbox

    <!DOCTYPE html>
    <html lang="zh">
    
    <head>
        <title></title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <script src="https://unpkg.com/vue/dist/vue.js"></script>
        <link href="../css/style.css" rel="stylesheet">
    </head>
    <body>
    <div id="myApp">
        <h1>表单复选框</h1>
        <input type="checkbox" id="生化危机7" value="生化危机7" v-model="checkedGames">
        <label for="生化危机7">生化危机7</label>
        <input type="checkbox" id="模拟飞行" value="模拟飞行" v-model="checkedGames">
        <label for="模拟飞行">模拟飞行</label>
        <input type="checkbox" id="塞尔达传说" value="塞尔达传说" v-model="checkedGames">
        <label for="塞尔达传说">塞尔达传说</label>
        <br>
        <p>您选择的游戏是: {{ checkedGames }}</p>
    </div>
    <script>
        var myApp = new Vue({
            el: '#myApp',
            data: {
                checkedGames: []
            },
            methods: {},
        });
    </script>
    </body>
    
    </html>

    20.radio

    <!DOCTYPE html>
    <html lang="zh">
    
    <head>
        <title></title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <script src="https://unpkg.com/vue/dist/vue.js"></script>
        <link href="../css/style.css" rel="stylesheet">
    </head>
    <body>
    <div id="myApp">
        <h1>表单单选按钮</h1>
    
        <h3>选择性别</h3>
        <input type="radio" id="male" name="sex" value="男" v-model="pickedSex">
        <label for="male">男</label>
        <br>
        <input type="radio" id="female" name="sex" value="女" v-model="pickedSex">
        <label for="female">女</label>
    
        <h3>选择爱好</h3>
        <input type="radio" id="game" value="玩游戏" v-model="pickedHobby">
        <label for="game">玩游戏</label>
        <br>
        <input type="radio" id="movie" value="看电影" v-model="pickedHobby">
        <label for="movie">看电影</label>
    
        <h3>选择结果</h3>
        <p>性别: {{ pickedSex }}</p>
        <p>爱好: {{ pickedHobby }}</p>
    
    </div>
    <script>
        var myApp = new Vue({
            el: '#myApp',
            data: {
                pickedSex: "",
                pickedHobby: "",
            },
            methods: {},
        });
    </script>
    </body>
    
    </html>

     21.表单下拉框绑定

    <!DOCTYPE html>
    <html lang="zh">
    
    <head>
        <title></title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <script src="https://unpkg.com/vue/dist/vue.js"></script>
        <link href="../css/style.css" rel="stylesheet">
    </head>
    <body>
    <div id="myApp">
        <h3>你最喜欢的NBA球星是:</h3>
        <select v-model="likedNBAStar" style="210px;">
            <option>科比</option>
            <option>詹姆斯</option>
            <option>哈登</option>
            <option>库里</option>
            <option>杜兰特</option>
        </select>
    
        <h3>我的全明星:</h3>
        <select v-model="likedNBAStars" multiple style="210px;height:210px;">
            <option>阿德托昆博</option>
            <option>怀特赛德</option>
            <option>阿尔德里奇</option>
            <option>戴维斯</option>
            <option>格里芬</option>
            <option>詹姆斯</option>
            <option>杜兰特</option>
            <option>巴特勒</option>
            <option>德罗赞</option>
            <option>哈登</option>
            <option>科比</option>
            <option>韦德</option>
            <option>伦纳德</option>
            <option>库里</option>
            <option>欧文</option>
            <option>保罗</option>
            <option>林树豪</option>
        </select>
    
        <h3>选择结果</h3>
        <p>我最最喜欢: {{ likedNBAStar }}</p>
        <p>我的全明星: {{ likedNBAStars }}</p>
    
    </div>
    <script>
        var myApp = new Vue({
            el: '#myApp',
            data: {
                likedNBAStar: null,
                likedNBAStars: [],
            },
            methods: {},
        });
    </script>
    </body>
    
    </html>

    22.其他表单绑定修饰

    * .lazy data中的值就不会实时变动,* .number 无法输入非数值内容,* .trim 去掉输入的前后空格
    <!DOCTYPE html>
    <html lang="zh">
    
    <head>
        <title></title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <script src="https://unpkg.com/vue/dist/vue.js"></script>
        <link href="../css/style.css" rel="stylesheet">
    </head>
    <body>
    <div id="myApp">
        <h1>用户注册</h1>
    
        <div>
            <label for="username">用户:</label>
            <input type="text" id="username" v-model.lazy="username" @change="checkUsername">
            <span v-if="checkUsernameOK">可注册</span>
        </div>
        <div>
            <label for="age">年龄:</label>
            <input type="number" id="age" v-model.number="age">
        </div>
        <div>
            <label for="content">个人简介:</label><br/>
            <textarea id="content" v-model.trim="content" cols="55" rows="8"></textarea>
        </div>
    
        <h4>信息区</h4>
        <p>{{username}}</p>
        <p>{{age}}</p>
        <p>
        <pre>{{content}}</pre>
        </p>
    </div>
    <script>
        var myApp = new Vue({
            el: '#myApp',
            data: {
                username: "",
                checkUsernameOK: false,
                age: "",
                content: "",
            },
            methods: {
                checkUsername: function () {
                    if (this.username.length > 0) this.checkUsernameOK = true;
                    else this.checkUsernameOK = false;
                },
            },
        });
    </script>
    </body>
    
    </html>

     23.* 组件(Component,Portlet)组件就是页面上的一小块区域内容,完成一个小的页面功能

    <!DOCTYPE html>
    <html lang="zh">
    
    <head>
        <title></title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <script src="https://unpkg.com/vue/dist/vue.js"></script>
        <link href="../css/style.css" rel="stylesheet">
    </head>
    <body>
    <div id="myApp">
        <today-weather></today-weather>
    </div>
    <script>
        Vue.component('today-weather', {
            template: '<div>今天下雨,出不去啦,干什么呢?看Youtube吧!</div>'
        });
        var myApp = new Vue({
            el: '#myApp',
        });
    </script>
    </body>
    
    </html>

     24.组件的局部注册

    <!DOCTYPE html>
    <html lang="zh">
    
    <head>
        <title></title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <script src="https://unpkg.com/vue/dist/vue.js"></script>
        <link href="../css/style.css" rel="stylesheet">
    </head>
    <body>
    <div id="myApp">
        <my-weather></my-weather>
    </div>
    <script>
        var WeatherComponent = {
            template: '<div>今天下雨,随它去吧!</div>'
        };
        var myApp = new Vue({
            el: '#myApp',
            data: {},
            components: {
                'my-weather': WeatherComponent
            },
        });
    </script>
    </body>
    
    </html>

     25.表行组件

    <!DOCTYPE html>
    <html lang="zh">
    
    <head>
        <title></title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <script src="https://unpkg.com/vue/dist/vue.js"></script>
        <link href="../css/style.css" rel="stylesheet">
    </head>
    <body>
    <div id="myApp">
        <h1>2017年最期待的游戏是:</h1>
        <table border="1">
            <tr>
                <td>编号</td>
                <td>游戏名称</td>
            </tr>
            <tr is="my-row1"></tr>
            <tr is="my-row2"></tr>
            <tr is="my-row3"></tr>
            <!--
                    <my-row1></my-row1>
                    <my-row2></my-row2>
                    <my-row3></my-row3>
            -->
        </table>
    </div>
    <script>
        Vue.component('my-row1', {
            template: '<tr><td>(1)</td><td>塞尔达传说:荒野之息(3/3)</td></tr>'
        });
        Vue.component('my-row2', {
            template: '<tr><td>(2)</td><td>新马里奥赛车(4/28)</td></tr>'
        });
        Vue.component('my-row3', {
            template: '<tr><td>(3)</td><td>喷射乌贼娘2代</td></tr>'
        });
        var myApp = new Vue({
            el: '#myApp',
            data: {},
            methods: {},
        });
    </script>
    </body>
    
    </html>

     26.组件数据函数

    <!DOCTYPE html>
    <html lang="zh">
    
    <head>
        <title></title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <script src="https://unpkg.com/vue/dist/vue.js"></script>
        <link href="../css/style.css" rel="stylesheet">
    </head>
    <body>
    <div id="myApp">
        <div>今天的天气是
            <today-weather/>
        </div>
    </div>
    <script>
        Vue.component('today-weather', {
            template: '<strong>{{todayWeather}}</strong>',
            data: function () {
                return {
                    todayWeather: '雨加雪'
                };
            }
        });
        var myApp = new Vue({
            el: '#myApp',
        });
    </script>
    </body>
    
    </html>

     27.为组件传递数据

    <!DOCTYPE html>
    <html lang="zh">
    
    <head>
        <title></title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <script src="https://unpkg.com/vue/dist/vue.js"></script>
        <link href="../css/style.css" rel="stylesheet">
    </head>
    <body>
    <div id="myApp">
        <h1>您的成绩评价</h1>
        <test-result :score="50"></test-result>
        <test-result :score="65"></test-result>
        <test-result :score="90"></test-result>
        <test-result :score="100"></test-result>
    </div>
    <script>
        Vue.component('test-result', {
            props: ['score'],
            template: '<div><strong>{{score}}分,{{testResult}}</strong></div>',
            computed: {
                testResult: function () {
                    var strResult = "";
                    if (this.score < 60)
                        strResult = "不及格";
                    else if (this.score < 90)
                        strResult = "中等生";
                    else if (this.score <= 100)
                        strResult = "优秀生";
                    return strResult;
                }
            }
        });
        var myApp = new Vue({
            el: '#myApp',
        });
    </script>
    </body>
    
    </html>

     28.为组件传递变量

    <!DOCTYPE html>
    <html lang="zh">
    
    <head>
        <title></title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <script src="https://unpkg.com/vue/dist/vue.js"></script>
        <link href="../css/style.css" rel="stylesheet">
    </head>
    <body>
    <div id="myApp">
        <div>请输入您的名字:<input v-model="myname"></div>
        <hr/>
        <say-hello :pname="myname"/>
    </div>
    <script>
        Vue.component('say-hello', {
            props: ['pname'],
            template: '<div>你好,<strong>{{pname}}</strong>!</div>',
        });
        var myApp = new Vue({
            el: '#myApp',
            data: {
                myname: 'Koma'
            }
        });
    </script>
    </body>
    
    </html>

     29.组件参数验证

    <!DOCTYPE html>
    <html lang="zh">
    
    <head>
        <title></title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <script src="https://unpkg.com/vue/dist/vue.js"></script>
        <link href="../css/style.css" rel="stylesheet">
    </head>
    <body>
    <div id="myApp">
        <h1>身世之谜</h1>
        <show-member-info name="koma" :age="25" :detail="{address:'earth', language:'世界语'}"></show-member-info>
    </div>
    <script>
        Vue.component('show-member-info', {
            props: {
                name: {
                    type: String,
                    required: true,
                },
                age: {
                    type: Number,
                    validator: function (value) {
                        return value >= 0 && value <= 130;
                    }
                },
                detail: {
                    type: Object,
                    default: function () {
                        return {
                            address: 'US',
                            language: 'English',
                        };
                    }
                },
            },
            template: '<div>姓名:{{this.name}}<br/>'
                + '年龄:{{this.age}}岁<br/>'
                + '地址:{{this.detail.address}}<br/>'
                + '语言:{{this.detail.language}} </div>',
        });
        var myApp = new Vue({
            el: '#myApp',
        });
    </script>
    </body>
    
    </html>

     30.组件的事件传递

    v-on 侦听组件事件,当组件触发事件后进行事件处理。
    $emit 触发事件,并将数据提交给事件侦听者。

    <!DOCTYPE html>
    <html lang="zh">
    
    <head>
        <title></title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <script src="https://unpkg.com/vue/dist/vue.js"></script>
        <link href="../css/style.css" rel="stylesheet">
    </head>
    <body>
    <div id="myApp">
        <h1>人生加法</h1>
        <add-method :a="6" :b="12" v-on:add_event="getAddResult"></add-method>
        <hr/>
        <h3>{{result}}</h3>
    </div>
    <script>
        Vue.component('add-method', {
            props: ['a', 'b'],
            template: '<div><button v-on:click="add">加吧</button></div>',
            methods: {
                add: function () {
                    var value = 0;
                    value = this.a + this.b;
                    this.$emit('add_event', {
                        result: value
                    });
                }
            },
        });
        var myApp = new Vue({
            el: '#myApp',
            data: {
                result: 0
            },
            methods: {
                getAddResult: function (pval) {
                    this.result = pval.result;
                }
            },
        });
    </script>
    </body>
    
    </html>

     31.组件插槽

    slot是父组件与子组件的通讯方式,可以将父组件的内容显示在子组件当中。

    <!DOCTYPE html>
    <html lang="zh">
    
    <head>
        <title></title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <script src="https://unpkg.com/vue/dist/vue.js"></script>
        <link href="../css/style.css" rel="stylesheet">
    </head>
    <body>
    <div id="myApp">
        <say-to pname="koma">
            你的视频做的太差了。
        </say-to>
        <say-to pname="mike">
            你千万不要学koma。
        </say-to>
        <say-to pname="john">
            你教教他们两个吧。
        </say-to>
    </div>
    <script>
        Vue.component('say-to', {
            props: ['pname'],
            template: '<div>'
                + '你好,<strong>{{pname}}</strong>!'
                + '<slot></slot>'
                + '</div>',
        });
        var myApp = new Vue({
            el: '#myApp',
        });
    </script>
    </body>
    
    </html>

     32.组件组合slot

    在子组件中通过为多个slot进行命名,来接受父组件的不同内容的数据。

    <!DOCTYPE html>
    <html lang="zh">
    
    <head>
        <title></title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <script src="https://unpkg.com/vue/dist/vue.js"></script>
        <link href="../css/style.css" rel="stylesheet">
    </head>
    <body>
    <div id="myApp">
        <nba-all-stars c="奥尼尔" pf="加内特">
            <span slot="sf">皮尔斯</span>
            <span slot="sg">雷阿伦</span>
            <span slot="pg">隆多</span>
        </nba-all-stars>
    </div>
    <script>
        Vue.component('nba-all-stars', {
            props: ['c', 'pf'],
            template: '<div>'
                + '<div>中锋:{{c}}</div>'
                + '<div>大前:{{pf}}</div>'
                + '<div>小前:<slot name="sf"></slot></div>'
                + '<div>分卫:<slot name="sg"></slot></div>'
                + '<div>控卫:<slot name="pg"></slot></div>'
                + '</div>',
        });
        var myApp = new Vue({
            el: '#myApp',
        });
    </script>
    </body>
    
    </html>

     33.其他指令,v-text

        1、作用:设置标签的文本值(textContext)
        2、默认写法会替换全部内容,使用差值表达式{ {} }可以替换指定内容
        3、内部支持写表达式
        示例代码
        <div id="app">
            <!-- v-text会替换标签中的所有内容 -->
            <h2 v-text="message + '!'">深圳</h2>
            <!-- { {} } 插值表达式-->
            <h2>深圳{{info + "!"}}</h2>
        </div>
        <!-- 开发环境版本,包含了有帮助的命令行警告 -->
        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
        <script type="text/javascript">
            var vm = new Vue({
                el: '#app',
                data:{
                    message:'程序员',
                    info: '前端与移动教研部'
                }
            })
        </script>

    34.其他指令,v-html

        1、作用:设置标签的innerHTML
        2、内容中有html结构会被解析为标签
        3、v-text 指令无论内容时什么,只会解析为文本
        4、解析文本使用v-text,需要解析html结构使用v-html
        示例代码
        <div id="app">
            <h2 v-html="content"></h2>
            <!--v-text 和 v-html 的差异-->
            <h2 v-html="content1"></h2>
            <h2 v-text="content1"></h2>
        </div>
        <!-- 开发环境版本,包含了有帮助的命令行警告 -->
        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
        <script type="text/javascript">
            var vm = new Vue({
                el: '#app',
                data:{
                    content    : '程序员',
                    content1 : '<a href="#">程序员</a>'
                }
            })
        </script>

    35.v-on补充

        1、事件绑定的方法写成函数调用的形式,可以传入自定义参数
        2、定义方法的时候需要定义形参来接收传入的实参
        3、事件的后面跟上.修饰符可以对事件进行限制
        4、.enter可以限制触发的案件为回车
        5、事件修饰符有很多种
        示例代码
        <div id="app">
            <input type="button" value="点击" @click="doIt(666,'老铁')" />
            <!-- 输入后回车弹出 -->
            <input type="text" @keyup.enter="sayHi()"/>
        </div>
        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
        <script>
            var vm = new Vue({
                el:"#app",
                methods:{
                    doIt:function(p1,p2){
                        console.log("做it");
                        console.log(p1);
                        console.log(p2);
                    },
                    sayHi:function(){
                        console.log("吃了吗");
                    }
                }
            })
        </script>

    36.axios加vue远程调用

       1、axios必须先导入才可以使用
       2、使用get或post方法即可发送对应的请求
       3、then方法中的回调函数会在请求成功或失败时触发
       4、通过回调函数的形参可以获取响应内容,或错误信息
       5、axios文档传送门https://github.com/axios/axios

        1、axios回调函数中的this已经改变,无法访问到data中数据
        2、把this保存起来,回调函数中直接使用保存的this即可
        3、和本地应用的最大区别就是改变了数据来源
        示例代码
        <div id="app">
            <input type="button" @click="getJoke()" value="获取笑话"/>
            <p>{{joke}}</p>
        </div>
        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
        <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
        <script>
            /**
            * 接口1 : 随机笑话
            * 请求地址:https://autumnfish.cn/api/joke
            * 请求方法:get
            * 请求参数:无
            * 响应内容:随机笑话
            */
            var vm = new Vue({
                el:"#app",
                data:{
                    joke :"好笑的笑话"
                },
                methods:{
                    getJoke:function(){
                        var that = this;
                        axios.get("https://autumnfish.cn/api/joke")
                        .then(function(response){
                            //console.log(response);
                            console.log(response.data);
                            that.joke = response.data;
                        },
                        function(err){
                            console.log(err);
                        })
                    }
                }
            })
    </script>
  • 相关阅读:
    .Net Core小技巧
    调用Kubernetes API操作Kubernetes
    在CentOS 7+ 安装Kubernetes入门(单Master)
    Linux命令行基础
    使用wireshark学习TCP
    Redis原子性写入HASH结构数据并设置过期时间
    Vue使用小结
    JAVA & .NET创建对象构造函数调用顺序
    .NET 中的序列化 & 反序列化
    ASP.NET Core中使用Graylog记录日志
  • 原文地址:https://www.cnblogs.com/shaozhiqi/p/14629850.html
Copyright © 2011-2022 走看看