zoukankan      html  css  js  c++  java
  • vue----使用

    api:https://cn.vuejs.org/v2/api/

    echart:https://www.echartsjs.com/examples/zh/editor.html?c=candlestick-brush   安装:npm i echarts @types/echarts --save

    如果使用IDEA,下载一个vue.js插件

    传统开发前端使用比较多的工具,vscode。Hbuilder。sublime3等。

    第一个 Vue 应用程序

    兼容性

    Vue 不支持 IE8 及以下版本,因为 Vue 使用了 IE8 无法模拟的 ECMAScript 5 特性。但它支持所有兼容 ECMAScript 5 的浏览器。

    下载地址

    • 开发版本
      • 包含完整的警告和调试模式:https://vuejs.org/js/vue.js
      • 删除了警告,30.96KB min + gzip:https://vuejs.org/js/vue.min.js
    • CDN
      • <script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.js"></script>
      • <script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script>

    使用

    Vue.js 的核心是实现了 MVVM 模式,她扮演的角色就是 ViewModel 层,那么所谓的第一个应用程序就是展示她的 数据绑定 功能,操作流程如下:

    1、创建一个 HTML 文件

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="UTF-8">
        <title>第一个 Vue 应用程序</title>
    </head>
    <body>
    
    </body>
    </html>

    2、引入 <script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.js"></script>

    3、创建一个 Vue 的实例

    <script type="text/javascript">
        var vm = new Vue({
            el: '#vue',
            data: {
                message: 'Hello Vue!' //表示监听了message,可以使用这个message,也可以不使用。
            }
        });
    </script> 

    说明

    • el:'#vue':绑定元素的 ID
    • data:{message:'Hello Vue!'}:数据对象中有一个名为 message 的属性,并设置了初始值 Hello Vue!

    4、将数据绑定到页面元素

    <div id="vue">
        {{message}}  //表示使用了message这个对象;
    </div>
    

      说明:只需要在绑定的元素中使用 双花括号 将 Vue 创建的名为 message 属性包裹起来,即可实现数据绑定功能,也就实现了 ViewModel 层所需的效果,是不是和 EL 表达式非常像?

    #{message} => {{message}}

    完整的 HTML

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="UTF-8">
        <title>第一个 Vue 应用程序</title>
        <script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.js"></script>
    </head>
    <body>
        <div id="vue"> //需要有一个div
            {{message}}
        </div>
    
    <script type="text/javascript">
        var vm = new Vue({
            el: '#vue', //表示vm接管了vue区域的管理权
            data: {
                message: 'Hello Vue!'
            }
        });
    </script>
    </body>
    </html>
    

      

    测试 Vue

    为了能够更直观的体验 Vue 带来的数据绑定功能,我们需要在浏览器测试一番,操作流程如下:

    • 在 Chrome 浏览器上运行第一个 Vue 应用程序,并按 F12 进入 开发者工具

    • 在控制台输入 vm.message = 'Hello World' ,然后 回车,你会发现浏览器中显示的内容会直接变成 Hello World

    说明

    在控制台直接输入 vm.message 来修改值(data中的message),中间是可以省略 data 的,在这个操作中,我并没有主动操作 DOM,就让页面的内容发生了变化,这就是借助了 Vue 的 数据绑定 功能实现的;MVVM 模式中要求 ViewModel 层就是使用 观察者模式 来实现数据的监听与绑定,以做到数据与视图的快速响应。

    所以如果通过后台传回了了数据,数据也会发生改变,也会自动的进行渲染。

    语法篇

    v-if,v-else

    html

    <div id="vue">
        <h1 v-if="ok">YES</h1>
        <h1 v-else>NO</h1>
    </div>
    

    javascript

    <script type="text/javascript">
        var vm = new Vue({
            el: '#vue',
            data: {
                ok: true
            }
        });
    </script>

    v-else-if

    <div id="vue">
        <h1 v-if="type === 'A'">A</h1>
        <h1 v-else-if="type === 'B'">B</h1>
        <h1 v-else-if="type === 'C'">C</h1>
        <h1 v-else>你看不见我</h1>
    </div>
    

      注:=== 三个等号在 JS 中表示绝对等于(就是数据与类型都要相等)

    javasrcipt

    <script type="text/javascript">
        var vm = new Vue({
            el: '#vue',
            data: {
                type: 'A'
            }
        });
    </script>

    v-for(遍历)

    <div id="vue">
        <li v-for="item in items">
            {{ item.message }}
        </li>
    </div>
    

      注:items 是源数据数组并且 item 是数组元素迭代的别名。是不是像极了 Thymeleaf

    javascript

    <script type="text/javascript">
        var vm = new Vue({
            el: '#vue',
            data: {
                items: [
                    {message: 'Foo'},
                    {message: 'Bar'}
                ]
            }
        });
    </script>

      在vue cli中的遍历,如果编译器爆红(浏览器不会错误),我们可以加上 :key

    <li v-for="(item,index) in users" :key="index">{{item}}</li>

    v-on(调用事件)

    • v-on:click 简写 @click
    <div id="vue">
        <button v-on:click="sayHi">点我</button>
    </div>
    

    javascript

    <script type="text/javascript">
        var vm = new Vue({
            el: '#vue',
            data: {
                message: 'Hello World'
            },
            // 在 `methods` 对象中定义方法
            methods: {
                sayHi: function (event) {
                    // `this` 在方法里指向当前 Vue 实例
                    alert(this.message);
                }
            }
        });
    </script>

    v-bind

            <input value="xxx"></input>  单纯的字符串
            <input :value="xxx"></input> 是data中的属性
    

      

    更多使用

      v-text:(单向绑定)当data中的数据修改,v-text数据就会修改

      v-model:(双向绑定)当data中的数据修改,v-model数据就会修改,当v-model中的数据修改,data中的数据修改(所以叫双向绑定)

      v-bind:(单向绑定)可以将数据对象绑定在dom的任意属性中。 简写  v-bind:name 简写 :name

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>vue.js常用指令的测试</title>
    </head>
    <body>
    <!--实现在body区域显示一个传智播客名称-->
    <div id="app">
        <!--相当于MVVM的view视图-->
        <!--{{name}}-->
        <a v-bind:href="url"><span v-text="name"></span></a>
        <div v-bind:style="{ fontSize: size + 'px' }">javaEE培训</div>
    
        <!--model双向绑定,v-model只能在input、select,textarea,components(vue中组件)使用-->
        <input type="text" v-model="num1"/> +
        <input type="text" v-model="num2"/>=
    
        <!--num1和num2的修改,会修改data中的数据,下面的值又是从data中获取,所以就会自动修改-->
        {{Number.parseInt(num1)+Number.parseInt(num2)}}<!--如果网速慢,页面上会出现{{Number.parseInt(num1)+Number.parseInt(num2)}}文本-->
        <span v-text="Number.parseInt(num1)+Number.parseInt(num2)"></span><!-- v-text:解决{{}}插值表达式闪烁的问题(如果网速慢,页面上会出现{{}}}这个文本)},所以以后我们只使用t-text-->
    
        <!-- 使用 v-on:click事件来修改这个值-->
        <span v-text="result"></span>
        <button v-on:click="change">计算</button>
    </div>
    </body>
    <!--为了演示插值表达式闪烁的问题,vue.min.js需要放到html下面-->
    <script src="vue.min.js"></script>
    <script>
        //编写MVVM中的model部分及VM(ViewModel)部分
        var VM = new Vue({
            //vm接管了app区域的管理
            el:'#app',
            //model数据
            data:{
                name:'黑马程序员',
                num1:0,
                num2:0,
                result:0,
                url:'http://www.itcast.cn',
                size:11
            },
            methods:{
                change:function () {
                    //必须要有this(会修改data中的result数据)
                    this.result = Number.parseInt(this.num1)+Number.parseInt(this.num2)
                }
            }
        });
    </script>
    </html> 

      v-for中的 :key 指定的是元素中的唯一值(暂时不知道确切用处,不指定也没事)

      v-for="(item,index) in list":括号中一个元素是list中的value,index中list中的key或者索引

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>vue.js常用指令的测试</title>
    </head>
    <body>
    <!--实现在body区域显示一个传智播客名称-->
    <div id="app">
        <!--相当于MVVM的view视图-->
        <ul>
            <li v-for="(item,index) in list" :key="index" v-if="index % 2 ==0">{{index}}--{{item}}</li>
            <hr/>
            <li v-for="(value,key) in user">{{key}}--{{value}}</li>
            <hr/>
            <li v-for="(item,index) in userlist" :key="item.user.name">
                {{index}}-{{item}}
            </li>
            <hr/>
            <li v-for="(item,index) in userlist" :key="item.user.name">
                <div v-if="item.user.name == '小明'" style="background: #00f50c">
                    {{index}}--{{item.user.name}}--{{item.user.age}}
                </div>
                <div v-else="">
                    {{index}}--{{item.user.name}}--{{item.user.age}}
                </div>
            </li>
        </ul>
    </div>
    </body>
    <script src="vue.min.js"></script>
    <script>
        //编写MVVM中的model部分及VM(ViewModel)部分
        var VM = new Vue({
            el: '#app',//vm接管了app区域的管理
            data: {//model数据
                list: [5, 4, 3, 2, 1],
                user: {name: '小明', age: 10},
                userlist: [
                    {user: {name: '小明', age: 10}},
                    {user: {name: '小红', age: 11}}
                ]
            }
        });
    </script>
    </html>
    

    常用

    vue.js中进行页面的跳转

    this.$router.push("/main"); //获取window.localtion

    获取url中的数据

    /xx/2 -->获取2使用 this.$route.params.id;  页面获取{{ $route.params.id }}
    /xx?id=2-->获取参数,使用 route.query.page
    

    页面调用方法

    {{test()}}
    

    获取元素对象,通过ref

    <p ref="p">hello</p>
    
    获取p元素:this.$refs.p
    

     watch监听属性变化

    计算属性computed

      普通方法调用:点击a++,修改了num1值,此时应该test1()方法被调用,但是我们发现test2方法也被带调用,原因是:只要是data中有值变化,所有的方法都会被调用

    <template>
        <div>
            <div class="home">home</div>
            <!--点击a++,会触发test2()-->
            <button @click="num1++">num1++</button>
            <button @click="num2++">num2++</button>
    
            <!--下面这个必须要写,为了触发test1和test2方法:只要有属性值发生了修改,就会触发方法调用-->
            {{test1()}}
            {{test2()}}
        </div>
    </template>
    <script lang="ts">
        import {Component,Vue} from "vue-property-decorator"
        @Component({
            components:{},
            data(){
                return{
                    a : 1,
                    num1 : 10,
                    num2 : 20
                }
            },
            methods:{
                test1(){
                    console.log("test1方法调用")
                    return this.$data.num1+this.$data.a
                },
                test2(){
                    console.log("test2方法调用")
                    return this.$data.num2+this.$data.a
                }
            }
        })
    
        export default class Home extends Vue{
    
        }
    </script>
    <style scoped>
    </style>
    

      计算属性:此时,只要num2不发生变化,test2()方法就不会被执行

    <template>
        <div>
            <div class="home">home</div>
            <!--点击a++,会触发test2()-->
            <button @click="num1++">num1++</button>
            <button @click="num2++">num2++</button>
    
            <!--下面这个必须要写,不知道为什么了-->
            {{test1}}
            {{test2}}
        </div>
    </template>
    <script lang="ts">
        import {Component,Vue} from "vue-property-decorator"
        @Component({
            components:{},
            data(){
                return{
                    a : 1,
                    num1 : 10,
                    num2 : 20
                }
            },
            computed:{
                test1(){
                    console.log("test1方法调用")
    
                    return this.$data.num1+this.$data.a
                },
                test2(){
                    console.log("test2方法调用")
                    return this.$data.num2+this.$data.a
                }
            }
        })
        export default class Home extends Vue{
        }
    </script>
    <style scoped>
    </style>
    

      点击a++,就会触发两个方法被调用了

            <button @click="num1++">num1++</button>
            <button @click="num2++">num2++</button>
            <button @click="a++">a++</button>

    动态绑定css

    <template>
        <div>
            <div class="home">home</div>
    
            <span class="test">ss</span>
    
            <!--效率低-->
            <span v-bind:class="{test:bigsize}" @click="sizeClick()">ss</span>
            <span v-bind:class="{test:bigsize}" @click="bigsize = !bigsize">ss</span> <!--等同于上面-->
    
            <!--计算属性绑定-->
            <span v-bind:class="sizeClick_computed" @click="sizeClick()">ss</span>
        </div>
    </template>
    <script lang="ts">
        import {Component,Vue} from "vue-property-decorator"
        @Component({
            components:{},
            data(){
                return{
                    bigsize:false
                }
            },
            methods:{
                sizeClick(){
                    this.$data.bigsize = !this.$data.bigsize
                }
            },
            computed:{
                sizeClick_computed(){
                    return{test:this.$data.bigsize}
                }
            }
        })
        export default class Home extends Vue{
        }
    </script>
    <style scoped>
        .test{
            font-size: 100px;
        }
    </style>

    template标签

      不渲染到DOM中,下面的案例中,只显示span标签

            <template>
                <span>xx</span>
            </template>

    组件

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="utf-8">
    </head>
    <body>
    <div id="app">
        <!--使用全局组件-->
        <test></test>
    </div>
    </body>
    <script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script>
    <script>
        /*定义全局组件*/
        Vue.component("test", {
            template: "<div>test</div>",
            data(){
              return{}
            }
        })
        var VM = new Vue({
            el: '#app',
        })
    </script>
    </html>
    

      

      

      

  • 相关阅读:
    线性基学习笔记
    内网靶机-抓取票据
    域渗透
    flex元素的使用
    webpack 基本使用
    ES模块的导入
    作用域插槽
    具名插槽的使用
    slot插槽的基本使用
    vue中父子组件的访问方式
  • 原文地址:https://www.cnblogs.com/yanxiaoge/p/11087084.html
Copyright © 2011-2022 走看看