• 浅谈Vue基础知识(一)


      首先是Vue的官网:https://cn.vuejs.org/

      查看官方文档是学习Vue框架的非常必要的环节之一

      Vue是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另一方面,当与现代化的工具链以及各种支持类库结合使用时,Vue 也完全能够为复杂的单页应用提供驱动。

      Vue和angular、react并列为三大主流框架,而和后两者想对比,Vue更为轻量,并且最易上手。

      Vue是一种MVVM开发模式的框架,相比于以前MVP模式的开发,它可以使我们只需要关注数据的操作即可,而不是使用大量的js去操作dom,大大的简化了代码,加快了项目的开发速度,并且代码易于管理。

      在使用Vue时,可以从网上下载vue.js,引入到项目中去,像引入jQuery一样,也可以使用vue-cli来建立vue项目,针对初学者,推荐第一种方法。

      建立Vue项目(自然是hello world):

    <!DOCTYPE html>
    <html lang="en">
        <head>
            <meta charset="utf-8">
                <title>
                    hello world
                </title>
                <script src="./vue.js" type="text/javascript">
                </script>
            </meta>
        </head>
        <body>
     <div id="app">
                {{content}}
            </div>
    <script type="text/javascript"> 
      var app=new Vue({
            el:
    '#app',
            data:{ content:
    "hello world" }
            })
    </script>
    </body>
    </html>

      v-是vue的指令:
      v-model可以实现vue的数据双向绑定;

      v-on绑定事件

    使用v-on为button绑定一个alertMessage的事件,在vue的methods中写一个alertMessage的function,这时点击button就会弹窗显示message的数据内容

      v-on可以简写为@,v-bind可以简写为: ;

    
    
    <!DOCTYPE html>
    <html lang="en">
        <head>
            <meta charset="utf-8">
                <title>
                    TodoList
                </title>
                <script src="./vue.js" type="text/javascript">
                </script>
            </meta>
        </head>
        <body>
            <div id="app">
                <input type="text" v-model="inputValue"/>
                <button v-on:click="handleBtnClick">
                    submit
                </button>
                <ul>
                    <li v-for="item in list">
                        {{item}}
                    </li>
                </ul>
            </div>
        </body>
        <script type="text/javascript">
            var app=new Vue({
                el:"#app",
                data:{
                    list:['todo','doing','done'],
                    inputValue:''
                },
                methods:{
                    handleBtnClick:function() {
                        if(this.inputValue!=""){
                            this.list.push(this.inputValue);
                        this.inputValue='';
                        }    
                    }
                }
            })
        </script>
    </html> 

    组件:
      组件系统是 Vue 的另一个重要概念,因为它是一种抽象,允许我们使用小型、独立和通常可复用的组件构建大型应用。一个应用、一个界面可以分化成一个个的小的组件。

    <!DOCTYPE html>
    <html lang="en">
        <head>
            <meta charset="utf-8">
                <title>
                    TodoList
                </title>
                <script src="./vue.js" type="text/javascript">
                </script>
            </meta>
        </head>
        <body>
            <div id="app">
                <input type="text" v-model="inputValue"/>
                <button @click="handleBtnClick">
                    submit
                </button>
                <ul>
                    
                    <todo-item @delete="handleItemDelete" :content="item" :index="index" v-for="(item,index) in list">
                    </todo-item>
                </ul>
            </div>
        </body>
        
        <script type="text/javascript">
            //全局组件
            // Vue.component("TodoItem",{
            //     props:['content'],
            //     template:"<li>{{content}}</li>"
            // })
            // 局部组件
            var TodoItem={
                props:['content','index'],
                 template:"<li @click='handleItemClick'>{{content}}</li>",
                 methods:{
                     handleItemClick:function(){
                          this.$emit("delete",this.index);
                     }
                 }
            }
            var app=new Vue({
                el:"#app",
                components:{
                    TodoItem:TodoItem
                },
                data:{
                    list:[],
                    inputValue:''
                },
                methods:{
                    handleBtnClick:function() {  
                        if(this.inputValue!=""){
                            this.list.push(this.inputValue);
                        this.inputValue='';
                        }
                        else{
                            alert("请输入");
                        }    
                    },
                    handleItemDelete:function(index){
                        this.list.splice(index,1);
                    }
                }
            })
        </script>
    </html>

      Vue的组件可以分为全局组件和局部组件,全局组件不需要再次声明,而局部组件需要去components中声明一下;
      组件命名推荐使用驼峰式例如TodoItem,但是在使用时要变成todo-item;
      可以使用v-bind从父组件向子组件传值,使用this.$emit()从子组件向父组件传值;
      写一个组件,首先在组件中定义一个自定义属性props接口,为组件的提供content、index变量,先将list的内容赋值给item,在子组件中显示content内容并且将index标号赋值,
    并且为生成的li中添加一个事件handleItemClick,在子组件中编写此事件的方法,每当点击时执行 this.$emit("delete",this.index);将index传递到父组件,并执行
    父组件的handleItemDelete事件,然后删除对应标号的内容;

      除了数据属性,Vue 实例还暴露了一些有用的实例属性与方法。它们都有前缀 $,以便与用户定义的属性区分开来。例如:vm.$data === data // => true

    vm.$el === document.getElementById('example') // => true
      $watch 是一个实例方法
      vm.$watch('a', function (newValue, oldValue) {
        // 这个回调将在 `vm.a` 改变后调用
      })
      v-for是循环遍历指令;
      生命周期的钩子(需要在实际开发中注意)
    比如 created 钩子可以用来在一个实例被创建之后执行代码,也有一些其它的钩子,在实例生命周期的不同阶段被调用,
    如 mounted、updated 和 destroyed。生命周期钩子的 this 上下文指向调用它的 Vue 实例。
      不要在选项属性或回调上使用箭头函数,比如 created: () => console.log(this.a) 或 vm.$watch('a', newValue => this.myMethod())
    因为箭头函数是和父级上下文绑定在一起的,this 不会是如你所预期的 Vue 实例,
    经常导致 Uncaught TypeError: Cannot read property of undefined 或 Uncaught TypeError: this.myMethod is not a function 之类的错误。
      通过使用 v-once指令,你也能执行一次性地插值,当数据改变时,插值处的内容不会更新;
      {{}}的方式赋值会将内容默认为文本,而如果需要的内容是HTML的话就需要v-html了;比如:content的值为<span style="color:red">this is should red.</span>

    <p>Using mustaches: {{ content }}</p> 显示<span style="color:red">this is should red.</span>

    <p>Using v-html directive: <span v-html="content"></span></p>显示this is should red.
    计算属性

    <div id="example">
    <p>Original message: "{{ message }}"</p>
    <p>Computed reversed message: "{{ reversedMessage }}"</p>
    </div>

    var vm = new Vue({
    el: '#example',
    data: {
    message: 'Hello'
    },
    computed: {
    // 计算属性的 getter
    reversedMessage: function () {
    // `this` 指向 vm 实例
    return this.message.split('').reverse().join('')
    }
    }
    })
    方法:

    <p>Reversed message: "{{ reversedMessage() }}"</p>

     

    // 在组件中
    methods: {
    reversedMessage: function () {
    return this.message.split('').reverse().join('')
    }
    }

    方法会在执行行刷新数值,而计算属性只有在它依赖的属性改变时才可以改变,计算属性只在相关依赖发生改变时它们才会重新求值。
    这就意味着只要 message 还没有发生改变,多次访问 reversedMessage 计算属性会立即返回之前的计算结果,而不必再次执行函数。
    这会大大的加快运行速度。但是

    computed: {
    now: function () {
    return Date.now()
    }
    }


    这也同样意味着下面的计算属性将不再更新,因为 Date.now() 不是响应式依赖:
    计算属性和侦听属性

    <!DOCTYPE html>
    <html lang="en">
        <head>
            <meta charset="utf-8">
                <title>
                    TodoList
                </title>
                <script src="./vue.js" type="text/javascript">
                </script>
            </meta>
        </head>
        <body>
            <div id="demo">
                {{ fullName }}
            </div>
        </body>
        <script type="text/javascript">
            var vm = new Vue({
              el: '#demo',
              data: {
                firstName: 'Foo',
                lastName: 'Bar',
                fullName: 'Foo Bar'
              },
              watch: {
                    firstName: function (val) {
                  this.fullName = val + ' ' + this.lastName
                },
                lastName: function (val) {
                  this.fullName = this.firstName + ' ' + val
            }
          }
    })
        </script>
    </html>
    <!DOCTYPE html>
    <html lang="en">
        <head>
            <meta charset="utf-8">
                <title>
                    TodoList
                </title>
                <script src="./vue.js" type="text/javascript">
                </script>
            </meta>
        </head>
        <body>
            <div id="demo">
                {{ fullName }}
            </div>
        </body>
        <script type="text/javascript">
    var vm = new Vue({
      el: '#demo',
      data: {
        firstName: 'Foo',
        lastName: 'Bar'
      },
      computed: {
         fullName: {
        // getter
        get: function () {
          return this.firstName + ' ' + this.lastName
        },
        // setter
        set: function (newValue) {
          var names = newValue.split(' ')
          this.firstName = names[0]
          this.lastName = names[names.length - 1]
        }
      }
      }
    })
        </script>
    </html>

    可以看到计算属性好多了;

    虽然计算属性在大多数情况下更合适,但有时也需要一个自定义的侦听器。这就是为什么 Vue 通过 watch 选项提供了一个更通用的方法,来响应数据的变化。

    当需要在数据变化时执行异步或开销较大的操作时,这个方式是最有用的。

     
     
     






  • 相关阅读:
    java 排序算法
    简单选择排序
    .net 调用css/javascipt出现的问题及解决
    《大道至简》的幕后故事(4):“愚公移山记”军事地理篇
    asp.net web services
    《大道至简》的幕后故事:终结篇、勘误和PDF下载
    Java开发人员的十大戒律
    NUnit 使用
    快速排序
    .NET中回发或回调参数无效问题的解决
  • 原文地址:https://www.cnblogs.com/tllw/p/9516845.html
Copyright © 2020-2023  润新知