1、安装

  1. BootCDN----官网https://www.bootcdn.cn/

    <script src="https://cdn.bootcss.com/vue/2.6.10/vue.js"></script>
    //或者
    <script src="https://unpkg.com/vue/dist/vue.js"></script>
  2. npm
    npm i vue --save-dev
  3. bower
    bower i vue --save-dev

2、数据绑定

  • 语法:采用了 “Mustache” 语法(标签) ----- 即 “文本插值” ----- {{ }}(双大括号)

3、指令

  • 定义:v-*,其值限定为绑定表达式
  • 作用:当表达式值变化的时候,可以将变化反应到DOM上
  • 内部指令:
    • v-if:根据表达式的值在DOM中生成或移除一个元素(false:不渲染对应元素;true:渲染元素,将对应元素的克隆插入DOM中)----- 真正的 “条件渲染”

      • 当为true时:

        <template>
        <div class="text">
        <p v-if="isSee">{{text}}</p>
        </div>
        </template>
        <script>
        export default {
        name : "test",
        data(){
        return{
        text : "你可以看到我吗?",
        isSee : true, }
        }, }
        </script>
        <style lang="scss" scoped> </style>

        结果为:

      • 当为false时:

        <template>
        <div class="text">
        <p v-if="isSee">{{text}}</p>
        </div>
        </template>
        <script>
        export default {
        name : "test",
        data(){
        return{
        text : "你可以看到我吗?",
        isSee : false, }
        }, }
        </script>
        <style lang="scss" scoped> </style>

        结果为:

                           

    • v-show:根据表达式的值显示或者隐藏HTML元素(false:元素隐藏,内联样式出现 style="dispaly:none" )

      • 当为true时:

        <template>
        <div class="text">
        <p v-show="isSee">{{text}}</p>
        </div>
        </template>
        <script>
        export default {
        name : "test",
        data(){
        return{
        text : "这次是隐藏还是显示?",
        isSee : true, }
        }, }
        </script>

        结果为:

      • 当为false时:
        <template>
        <div class="text">
        <p v-show="isSee">{{text}}</p>
        </div>
        </template>
        <script>
        export default {
        name : "test",
        data(){
        return{
        text : "这次是隐藏还是显示?",
        isSee : false, }
        }, }
        </script>

        结果为:

      • v-if与v-show的区别:

        • v-if是惰性的,如果初始渲染时条件为假,则什么也不做——直到条件第一次变为真时,才会开始渲染条件块(局部编译,编译会被缓存起来);

相比之下v-show 就简单得多——不管初始条件是什么,元素始终被编译并保留,只是简单地基于 CSS 进行切换;

总结:一般来说,v-if 有更高的切换开销,而 v-show 有更高的初始渲染开销。因此,如果需要非常频繁地切换,则使用 v-show 较好;如果在运行时条件很少改变,则使用 v-if 较好

          • v-if支持<template>语法,可以切换多个元素,并且不会被渲染到DOM结构上;而v-show不支持<template>语法;
      • v-else:必须跟着v-if或者v-show,或者不会被识别
        <template>
        <div class="text">
        <p v-if="age > 18">成年了</p>
        <p v-else>未成年</p>
        </div>
        </template>
        <script>
        export default {
        name : "test",
        data(){
        return{
        age : 10 }
        }, }
        </script>

        结果为:未成年

      • v-model:用来在input、select、checkbox等表单控件上创建 “双向数据绑定”(例如element-ui中的表单数据绑定)
        • 修饰符

          • number:用户输入的转换为Number类型,如果原值为NaN就返回原值
          • lazy:失去焦点时数据才改变,相当于input的change事件(点击回车)
          • trim:去掉前后的空格
          • debounce:设置一个最小的延时,是更新发生在延时之后(防止input每次输入数据都发送AJAX请求)单位ms(只存在于Vue1.x中,其他版本已经移除)
      • v-for:基于源数据重复渲染元素
      • 遍历数组:item  in/of items 的形式

        <template>
        <div class="text">
        <ul>
        <li v-for="(tap,tapIndex) of taps" :key="tapIndex">{{tapIndex}}---{{tap}}</li>
        </ul>
        </div>
        </template>
        <script>
        export default {
        name : "test",
        data(){
        return{
        taps : ["西红柿","冬瓜","茄子"]
        }
        }, }
        </script>

        结果为:

        • 遍历对象  (Object.keys()的结果进行遍历)

          <template>
          <div class="text">
          <ul>
          <li v-for="(value,key,index) of Person" :key="index">{{index}}---{{key}}---{{value}}</li>
          </ul>
          </div>
          </template>
          <script>
          export default {
          name: "test",
          data() {
          return {
          Person: {
          name: "Jane Doe",
          age: "22",
          sex: "女"
          }
          };
          },
          methods: {}
          };
          </script>

          结果为:

      • v-text(相当于插值表达式)

        <template>
        <div class="text">
        <p v-text="text"></p>
        <p>{{text}}</p>
        </div>
        </template>
        <script>
        export default {
        name: "test",
        data() {
        return {
        text : "插值表达式"
        };
        },
        methods: {}
        };
        </script>

        结果为:

      • v-html(渲染html标签)Vue1.x版本的{{{ html标签表达式}}}写法已经被移除

        <template>
        <div class="text">
        <p>我是原来的p标签</p>
        <!-- <div>{{{text}}}</div> -->
        <div v-html="text"></div>
        </div>
        </template>
        <script>
        export default {
        name: "test",
        data() {
        return {
        text : "<p>我是新来的p标签</p>"
        };
        },
        methods: {}
        };
        </script>

        结果为:

      • v-bind(可以简写为 “:”)绑定表达式到标签的属性上,常绑定属性有class、style、src等

        • 绑定class支持变量

          <template>
          <div id="example">
          <p :class="classA ? 'ok' : 'not'">绑定表达式</p>
          </div>
          </template>
          <script>
          export default {
          name: "example",
          data() {
          return {
          classA : true
          };
          },
          methods: {}
          };
          </script>

          结果为:

        • 绑定class支持对象

          <template>
          <div id="example">
          <p :class="{'classA' : data.isA , 'classB' : data.isB }">绑定对象</p>
          </div>
          </template>
          <script>
          export default {
          name: "example",
          data() {
          return {
          data : {
          classDedault : 'classD',
          isA : true,
          isB : true
          }
          };
          },
          methods: {}
          };
          </script>

          结果为:

          • 当然,绑定class可以与普通的class特性共存,也可以直接绑定一个对象;
          • 也可以绑定一个计算属性:
            <template>
            <div id="example">
            <p class="classA" :class="classOther">过滤器:{{ time | timeFormatter}}</p>
            </div>
            </template>
            <script>
            export default {
            name: "example",
            data() {
            return {
            time : new Date().getTime(),
            className : {
            'classB' : 20,
            'classC' : 3
            }
            };
            },
            computed: {
            classOther : {
            get : function(){
            return {
            'classB' : this.className.classB > 20 ? true : false,
            'classC' : this.className.classC < 4 ? true : false
            }
            }
            }
            },
            methods: {}
            };
            </script>

        • 绑定class支持数组
          <template>
          <div id="example">
          <p :class="[data.classA,data.classB]">绑定对象</p>
          </div>
          </template>
          <script>
          export default {
          name: "example",
          data() {
          return {
          data : {
          classA : 'class-a',
          classB : 'class-b'
          }
          };
          },
          methods: {}
          };
          </script>

          结果为:

        • 绑定内联样式style:跟class一样,对象、数组、计算属性都支持,但是采用的是 “ 驼峰式命名 ”
      • v-on:(监听DOM事件)可以简写为 “ @ ”
        • 内联处理器中的方法:

          <template>
          <div id="example">
          <p
          @click="test('你传事件$event了吗',$event)"
          style="width:200px;height:200px;background:red"
          >v-on的内联传事件及参数的方法</p>
          </div>
          </template>
          <script>
          export default {
          name: "example",
          data() {
          return {
          test(message, event) {
          if (event) {
          console.log(event)
          event.preventDefault()
          } else {
          console.log(message);
          }
          }
          };
          },
          methods: {}
          };
          </script>

          $event是指原生的DOM事件,默认可以传递;

结果为:点击发生

        • 事件修饰符

          • .stop(阻止单击事件继续传播,即停止冒泡)
          • .prevent(阻止元素的默认行为,相当于e.preventDefault() )
          • .capture(添加事件监听器时使用事件捕获模式)
          • .self(事件只在该元素本身(而非子元素)触发时执行函数)
          • @keyup.enter || @keyup.enter.native(@keyup.13一样)点击回车时进行调用 ----- native后缀可以在父组件在子组件上绑定一个原生的事件,从而转化为一个普通的HTML标签(.native在普通标签上不起作用)
          • @keyup.esc(回撤)@kuyup.delete(删除或者退格等)
      • v-ref:(建立索引,用this.$refs.someRef访问元素  元素用v-ref="some-ref"标记)
      • v-el:(获取当前元素的内容)Vue2.x已经废除
        <template>
        <div id="example">
        <p v-el:some-data>我的内容是:你</p>
        </div>
        </template>
        <script>
        export default {
        name: "example",
        data() {
        return { };
        },
        methods: {},
        mounted(){
        console.log(this.$els.someData.textContent)//我的内容是:你
        }
        };
        </script>
      • v-once:数据只能绑定一次,后续数据的变化不在关心(vue2.x新增的指令)
      • v-pre:(显示原始的Mustache标签)
        <template>
        <div id="example">
        <p v-pre>{{number}}</p>
        </div>
        </template>
        <script>
        export default {
        name: "example",
        data() {
        return {
        number : "2222"
        };
        },
        methods: {}, };
        </script>

        结果为:

      • v-cloak:(元素在vue没有加载完的时候就有这个属性,当vue加载完成后这个属性就消失了-----防止在渲染页面时,用户首先看到Mustache标签)

        <style>
        p[v-cloak]{visibility:hidden}//display:none
        </style> <p v-cloak>{{msg}}</p>
  • 自定义指令
    • 格式:Vue.directive(id,definition)      注册全局自定义指令
    • 提供的钩子函数
      • bind/unbind-----只执行一次,指令第一次被绑定(解绑)时调用
      • inserted-----被绑定的元素插入父元素时调用
      • update-----在bind之后立即以初始值为参数第一次调用,之后绑定值发生变化调用,参数为新值与旧值update(newValue,oldValue)
      • componentUpdated-----所在组件以及他的子组件全部更新后调用

        (注意:除了update和componentUpdated之外,每个钩子函数都有el、binding、vnode三个参数,而oldValue只有在update和componentUpdated中有效,并且除了el,其他两者都只有只读)

    • 指令实例属性(即钩子函数的参数)——只读,不可修改

      • el——指令绑定的DOM元素
      • binding包括以下属性
        • name——指令的名字,不包括前缀
        • value——新值
        • oldValue——旧值
        • expression——指令的表达式,不包括指令和过滤器   v-load="1 + 1"  结果为1+1
        • arg——指令的参数   v-load:foo    结果为foo
        • modifiers——一个对象,包含指令的修饰符   v-load.literal  结果为 { literal : true }
        • vm——拥有该指令的上下文ViewModel(废除)
        • descriptor——一个对象,包含指令的解析结果(废除)
      • 注意:
      • 使用步骤
        • 建立一个js文件,此处命名为module.js   不支持    箭头函数

          import Vue from 'vue'
          Vue.directive('load', {
          bind(el, binding) {//准备工作
          if (binding.value) {
          console.log(el)
          console.log("name---" + binding.name)
          console.log("value---" + binding.value)
          console.log("oldValue---" + binding.oldValue)
          console.log("expression---" + binding.expression)
          console.log("arg---" + binding.arg)
          let div = document.createElement("div");
          div.className = "loading-parent";
          div.innerHTML = `
          <div class="loading-spinner"><i class='el-icon-loading'></i></div>
          `;
          el.appendChild(div);
          }
          },
          update(el, binding) {//值更新时的工作
          if (binding.value) {
          console.log(el)
          console.log("name---" + binding.name)
          console.log("value---" + binding.value)
          console.log("oldValue---" + binding.oldValue)
          console.log("expression---" + binding.expression)
          console.log("arg---" + binding.arg)
          let div = document.createElement("div");
          div.className = "loading-parent";
          div.innerHTML = `
          <div class="loading-spinner"><i class='el-icon-loading'></i></div>
          `;
          el.appendChild(div);
          el.load = div;
          } else {
          el.load && el.load.parentNode && el.load.parentNode.removeChild(el.load);
          }
          },
          unbind: function () {//清理工作 }
          })

          结果为:

          • 我们可以看到代码重复率太高,因此规定了简写方式,只有bind和update时,可以简写为

            import Vue from 'vue'
            Vue.directive('load', function (el, binding) {//值更新时的工作
            if (binding.value) {// 1
            let div = document.createElement("div");
            div.className = "loading-parent";
            div.innerHTML = `
            <div class="loading-spinner"><i class='el-icon-loading'></i></div>
            `;
            el.appendChild(div);
            el.load = div;
            } else {
            el.load && el.load.parentNode && el.load.parentNode.removeChild(el.load);
            }
            }
            )
        • app..js文件中引入    import module from './module.js'
        • 使用
          <template>
          <div id="example" @click="up" style="width:100px;height:100px;background:pink">
          <div id="demo" v-load="msg"></div>
          </div>
          </template>
          <script>
          export default {
          name: "example",
          data() {
          return {
          msg: 1
          };
          },
          methods: {
          up() {
          this.msg += 1;
          }
          },
          mounted() {}
          };
          </script>

          结果为:首次执行bind函数,每次点击执行update

点击时,值变化

    • 局部定义指令(例子:实现图片的一定div内的拖拽功能)

      • html

        <div class="previewImg">
        <img
        :src="alImgUrl"
        class="currentImg"
        :id="inner.id"
        v-drag
        style="cursor:pointer"
        :draggable="false"//拖拽必须加
        />
        </div>
      • css ----- 必须设置定位
        .previewImg {
        position: relative;
        .currentImg {
        position: absolute;
        left: 150px;
        top: ;
        width: 450px;
        height: 636px;
        margin-left: 50px;
        -moz-user-select: none; /*火狐*/
        -webkit-user-select: none; /*webkit浏览器*/
        -ms-user-select: none; /*IE10*/
        -khtml-user-select: none; /*早期浏览器*/
        user-select: none;
        }
        }
      • js
        directives: {
        drag(el, binding) {
        el.onmousedown = function(e) {
        //获取鼠标点击处分别与div左边和上边的距离:鼠标位置-div位置
        var divx = e.clientX - document.getElementsByClassName("currentImg")[].offsetLeft;
        var divy = e.clientY - document.getElementsByClassName("currentImg")[].offsetTop;
        //包含在onmousedown里,表示点击后才移动,为防止鼠标移出div,使用document.onmousemove
        document.onmousemove = function(e) {
        //获取移动后div的位置:鼠标位置-divx/divy
        var l = e.clientX - divx;
        var t = e.clientY - divy;
        document.getElementsByClassName("currentImg")[].style.left = l + "px";
        document.getElementsByClassName("currentImg")[].style.top = t + "px";
        };
        document.onmouseup = function(e) {
        document.onmousemove = null;
        document.onmouseup = null;
        };
        };
        }
        },
    • 对象字面量(指令传入多个值)
      • 定义

        import Vue from 'vue'
        Vue.directive('load', function (el, binding) {//值更新时的工作
        if (binding.value) {// 1
        console.log(binding.value)
        let div = document.createElement("div");
        div.className = "loading-parent";
        div.style.color = binding.value.color;
        div.style.fontSize = binding.value.fontSize
        div.innerHTML = `
        <div class="loading-spinner"><i class='el-icon-loading'></i></div>
        `;
        el.appendChild(div);
        el.load = div;
        } else {
        el.load && el.load.parentNode && el.load.parentNode.removeChild(el.load);
        }
        }
        )
      • 使用
        <template>
        <div id="example" @click="up" style="width:100px;height:100px;background:pink">
        <div id="demo" v-load="{msg : msg,color:'#f00',fontSize:'30px'}"></div>
        </div>
        </template>
        <script>
        export default {
        name: "example",
        data() {
        return {
        msg: 1
        };
        },
        methods: {
        up() {
        this.msg += 1;
        }
        },
        mounted() {}
        };
        </script>

        结果为:

    • 字面修饰符(值按照普通字符串传递给update,update只调用一次)

      <template>
      <div id="example" @click="up" style="width:100px;height:100px;background:pink">
      <div id="demo" v-load.literal="msg "></div>
      </div>
      </template>
      <script>
      export default {
      name: "example",
      data() {
      return {
      msg: 1
      };
      },
      methods: {
      up() {
      this.msg += 1;
      }
      },
      mounted() {}
      };
      </script>

      结果为:

      console.log(binding.value)
      console.log(binding.modifiers)

    • 元素指令(作为一个标签出现,不接受参数与表达式)

      • 特点:终结性(只有该元素指令本身可以操作该元素及其子元素)
    • 高级选项
      • params:(自定义属性)

        <p v-finish="msg" name="wxh">1111111111</p>
        import Vue from 'vue'
        Vue.directive("finish", function (el, binding) {
        if(binding.value){
        binding.value = 2;
        console.log(el.getAttribute("name"));
        console.log(binding.value);
        }
        })

        结果为:

      • deep
      • twoWay
      • acceptStatement
      • Terminal
      • priority

4、常见问题解析

  • v-on可以绑定多个方法吗?(如果绑定多个,只会执行第一个,其他的自动忽略)
  • 一个Vue实例可以绑定多个element元素吗?
  • 在Vue中,如何让v-for循环出来的列表的click事件只对当前元素有效 https://www.cnblogs.com/tangwanzun/p/7828317.html

Vue入门---安装及常用指令介绍的更多相关文章

  1. corosync+pacemaker的crmsh的常用指令介绍

    配置crmsh的yum仓库,此仓库的RPM包有openSUSE提供,将这个network:ha-clustering:Stable.repo文件直接下载到本地并且命名为crmsh.repo wget ...

  2. 新人成长之入门Vue.js常用指令介绍(一)

    写在前面 作为一个刚步入职场工作的新人,对于公司中所用的技术和框架基本上不懂,只能从最基础的开始做起,进入公司接触的第一个框架就是前端框架Vue.js,几个功能做下来,觉得Vue.js首先学习起来真的 ...

  3. docker基础——关于安装、常用指令以及镜像制作初体验

    为什么使用docker docker就是一个轻量级的虚拟机,他解决的是服务迁移部署的时候环境配置问题.比如常见的web服务依赖于jdk.Tomcat.数据库等工具,迁移项目就需要在新的机器重新配置这些 ...

  4. 第一节. .Net Core环境的安装和常用指令

    一. 环境介绍和安装 1. 环境介绍 .Net FrameWork框架:BCL(基础类库 system.dll).CLR(运行时 仅支持:Windows).FCL(一些框架,比如:MVC.WPF) . ...

  5. virtualenvwrapper安装和常用指令(mac)

    安装: .安装(要有python环境+pip): * sudo pip install virtualenvwrapper .配置: 执行:vi ~/.bash_profile 在~/.bash_pr ...

  6. docker创建image方法以及常用指令介绍

    docker -help    # 显示帮助 docker COMMAND -help    # 帮助信息更详细 docker start “容器名称”    # 启动一个或多个容器 docker s ...

  7. Docker 安装与常用命令介绍

    docker的镜像文件作用就是:提供container运行的文件系统层级关系(基于AUFS实现),所依赖的库文件.已经配置文件等等. 安装docker yum install -y docker 启动 ...

  8. Vue模板语法与常用指令

    Vue.js 使用了基于 HTML 的模板语法,允许开发者声明式地将 DOM 绑定至底层 Vue 实例的数据.在底层的实现上,Vue 将模板编译成虚拟 DOM 渲染函数,结合相应系统,在应用状态改变时 ...

  9. Nginx学习系列四默认负载均衡轮询及Ip_hash等常用指令介绍

    一.简介 Upstream模块是Nginx中一个核心模块,当客户端访问Nginx服务器的时候,Nginx会从服务器列表中选取压力小的服务器,然后分配给客户端进行访问.这个过程,Nginx通过轮询算法轮 ...

随机推荐

  1. Quartus 中调用modelsim的流程及*.vt或*.vht自动生成

    一.自动生成验证程序testbench的方法,setting-EDA Tool->simylation->选择对应的语言(verilog对应*.vt,VHDL对应*.vht)process ...

  2. 系统环境: CentOS 64位+千万不要在生产环境中升级glibc!

    # cd /lib64# LD_PRELOAD=/lib64/libc-2.15.so ln -sf /lib64/libc-2.15.so libc.so.6 libc-2.15.so 这个文件名根 ...

  3. 内置的logging模块

    #logging模块 import logging #通过basicConfig方法设置日志格式,但这种只能在屏显和文件显示中选择其中一个 logging.basicConfig( #设置日志的各种信 ...

  4. 数据仓库Hive(一)——hive简介,产生,安装

    1.Hive简介 数据仓库 解释器.编译器.优化器等 运行时,元数据存储在关系型数据库里面 1.1数据库和数据仓库的区别 数据库需要立即返回结果,数据仓库不需要 数据仓库能收纳各种数据源,而数据库只能 ...

  5. JavaScript设计模式 样例三 —— 装饰模式

    装饰模式(Decorator Pattern): 定义:在不改变原对象的情况下,动态的给对象添加一些额外的职责.就功能而言,装饰模式相比生成子类更为灵活. 目的:把类的核心职责和装饰功能区分开.可以去 ...

  6. airflow 简介

    转载:https://zhuanlan.zhihu.com/p/36043468 简介 Apache-Airflow 是Airbnb开源的一款数据流程工具,目前是Apache孵化项目.以非常灵活的方式 ...

  7. php内置函数分析之current()、next()、prev()、reset()、end()

    current()初始指向插入到数组中的第一个单元 next() 将数组的内部指针向前移动一位 prev() 将数组的内部指针倒回一位 reset() 将数组的内部指针指向第一个单元 end() 将数 ...

  8. 多对多关系表的创建方式、forms组件

    目录 多对多关系表的三种创建方式 1.全自动,Django自动创建 2.纯手撸 3.半自动(推荐使用) forms组件 小例子 forms组件 校验器 钩子函数 局部钩子 全局钩子 forms组件常用 ...

  9. Java并行

    序言 Java 有四种并行方式: 1.thread  使用“原汁原味”的裸线程 2.Executor (java 5 以后出现的) 3.Forkjoin 框架 (java 8 出现的) 4.Actor ...

  10. Python常用框架

    序言 所谓专家,就是在一个很小的领域里把所有错误都犯过了的人--尼尔斯·玻尔 Django Flask Tornado 适合后端微服务 资料 flask