• Vue 实例之事件 操作样式 (文本、事件、属性、表单、条件)指令


     Vue

      可以独立完成前后端分离式web项目的JavaScript框架

      三大主流框架之一: Angular  React  Vue

      先进的前端设计模式:MVVM

      可以完全脱离服务器端,以前端代码复用的方式渲染整个页面:组件化开发

      特点:

        单页面web应用

        数据驱动

        数据的双向绑定

        虚拟DOM

    1 vue初识

      变量的定义与值的的输出

      vue变量:被称为插值表达式  {{ vue变量 }}

    <div id='app'>
        <h1> {{ h1_msg }} </h1>
        <h2> {{ h2_msg }} </h2>
    </div>
    //js
    
    <script>
        new Vue({
               el:'#app',      //被称为挂载点
               data:{           //为挂载点的页面结构提供数据 
                  h1_msg:'h1的内容',
                  h2_msg:'h2的内容',
      }
    })   

     可以识别html标签

      vue的使用:

      1. 在html中书写挂载点的页面结构,用id表示 (id具有唯一标识性)
      2. 在自定义的script标签内用new关键字实例化Vue对象,传入一个大字典
      3. 在字典中通过 el挂载点 与挂载点页面结构绑定,data为 挂载点里面的变量 传输数据
    2 vue实例之事件

     用 v-on 指令添加一个事件监听器,通过它调用在 Vue 实例中定义的方法:

      v-on:事件名='变量名'  实例化Vue里面 methods关键字  为挂载点提供事件的 里面写你的    变量名:function

    <!--html-->
    <div id="app">
        <h1 v-on:click="clickAction">h1的内容是{{ msg }}</h1>
    </div>
    //js
    <script>
        new Vue({
            el:'#app',
            data:{
                msg:'vue渲染的内容'
            },
            methods:{   //为挂载点提供事件的
                clickAction:function () {
                    alert(123)
                }
            }
        })
    </script>
    3 vue操作样式

     v-bind 特性被称为指令。指令带有前缀 v-,以表示它们是 Vue 提供的特殊特性。可能你已经猜到了,它们会在渲染的 DOM 上应用特殊的响应式行为。在这里,该指令的意思是:“将这个元素节点的 style特性和 Vue 实例的 v_style 属性保持一致”。

    <!--html-->
    
    <div id="app">
        <p v-on:click="btnClick" v-bind:style="v_style">点击p文字颜色变为绿色</p>
        <div v-on:click="btnClick" v-bind:style="v_style"> click me give your some color ! </div>
    </div>
    //js
    
    <script>
        new Vue({
            el:'#app',
            data:{
                v_style:{
                    color:'block'
                }
            },
            methods:{
                btnClick:function () {
                    this.v_style.color = 'green'  //只要是在id为app div标签里面的都可以用this 都是Vue实例化的对象
                }
            }
        })
    </script>

    小结:

      vue通过 v- 指令来控制标签的属性

      vue通过 变量 数据驱动页面(页面内容)

    4 文本指令

    v-on:mouseover  鼠标悬停   

    v-once  只能操作一次  当数据改变时,插值处的内容不会更新。但请留心这会影响到该节点上的其它数据绑定  

    v-text:  给标签加内容

    v-html:  输出真正的 HTML,你需要使用 v-html指令:

    <!--html-->
    
    <div id="app">
        <p>{{ msg1 }}</p>
        <!--<p v-text="msg2"></p>-->
        <p v-html="msg2"></p>
        <p v-html="msg3"></p>
        <p v-once="msg4" v-on:mouseover="action">{{ msg4 }}</p>
    </div>
    //js 
    
    <script>
        new Vue({
            el:'#app',
            data:{
                msg1:'msg1',
                msg2:'<b>**msg2**</b>',
                msg3:'msg3',
                msg4:'hover me!'
            },
            methods:{
                action:function () {
                // 如果想操作第一层级的(el data methods) data的话 需要用this.$data
                    this.msg3 = '<i>new msg3</i>'
                    //this.$data.msg3
                }
            }
        })
    </script>

    5 事件指令

    v-on:'事件名' 可以简写为 @事件名='函数名'  v-on == > @

    v-bind:herf  可以简写为  :herf  v-bind ==> : 

    click 鼠标点击 鼠标事件的对象:直接写函数名,默认将鼠标事件对象传入  $event就代表鼠标事件对象

    事件的传参 函数可以写多个值   传值可以不用按照函数的位置形参(必须被传值)

    <!--html-->
    
    <div id="app">
        <p v-on:click="action1">{{ msgs[0] }}</p>
        <p @click="action2">{{ msgs[1] }}</p>
    
    
        <!--事件的传参-->
        <ul>
            <li @click="liAction(100)">列表项1</li>
            <li @click="liAction(200)">列表项2</li>
            <li @click="liAction(300)">列表项3</li>
        </ul>
    
        <!--鼠标事件的对象:直接写函数名,默认将鼠标事件对象传入-->
        <div @click="func1">func1</div>
    
        <!--鼠标事件的对象:一旦添加(),就必须手动传参, $event就代表鼠标事件对象-->
        <div @click="func2($event,'abc')">func2</div>
    
    </div>
    //js 
    
    <script>
        new Vue({
            el:'#app',
            data:{
                msgs:['111','222']
            },
            methods:{
                action1:function () {
                    alert(this.msgs[0])
                },
                action2:function () {
                    alert(this.msgs[1])
                },
                liAction:function (mun,msg) {
                    console.log(mun,msg)
                },
                func1:function (ev) {
                    console.log(ev)
                },
                func2:function (ev,msg) {
                    console.log(ev);
                    console.log(msg)
                }
            }
        })
    </script>

    函数(两个位置参数)  事件传参传一个值  事件liAction

     函数传入传入$event 鼠标事件对象  abc   事件func2

     鼠标事件 直接写行数名func1

     

    6 属性指令

     用vue绑定属性,将属性内容交给vue处理

    class 属性可以设置单个属性  多个类名:[c1,c2]  如果想固定写死一个数据,不再是变量  :class="  'br' "    多类名:class="[c1,'br']"

    style 属性  :style='s1'  一个变量:该变量的值是一个大字典{}  {}字典内部完成一个个属性的设置  

                    一个{}字典  字典内一个个属性有一个个变量单独控制  :style="{fonSize:fs,color:c}"

        <style>
            .rDiv {
                width: 100px;
                height: 100px;
                background-color: red;
            }
            .gDiv {
                width: 200px;
                height: 50px;
                background-color: green;
            }
            .br {
                border-radius: 50%;
            }
        </style>
    
    <div id="app">
        <!--属性指令:用vue绑定属性,将属性内容交给vue处理-->
          <p class="" style="" v-bind:owen="oo" :jason="jj"></p>
    
        <!--class属性-->
        <p :class="c1" @click="action1"></p>
        <!--多类名-->
         <p :class="[c1, c2]"></p>
        <!--'br'固定写死的数据,不再是变量-->
        <p :class="[c1, 'br']"></p>
    
        <!--style属性-->
        <!--一个变量:该变量值为{}  {}字典内部完成一个个属性的设置-->
        <p class="gDiv" :style="s1">12345</p>
        <!--一个{}字典: 字典内一个个属性有一个变量单独控制-->
        <p class="gDiv" :style="{ fontSize:fs,color:c }">6789</p>
    
    </div>
    <script>
        new Vue({
            el:'#app',
            data:{
                oo:'Owen',
                jj:'Jason',
                c1:'rDiv',
                c2:'br',
                s1:{
                    fontSize:'30px',
                    color:'yellow',
                },
                fs:'20px',
                c:'orange'
            },
            methods:{
                action1:function () {
                    if (this.c1=='rDiv'){
                        this.c1='gDiv'
                    }else{
                        this.c1='rDiv'
                    }
                }
            }
        })
    </script>
    7 表单指令

     表单指令:v-model='变量'  在两个输入框属性中都定义同一个话 两个输入框内容会同步

    单选框 v-model 绑定的变量是单选框中某一个input的value

     多选框 v-model绑定的变量是一个列表 ,列表存放0到任意一个多选框的value

    <div id="app">
        <!--表单指令: v-model='变量'-->
        <form action="">
            <p>
                <input type="text" v-model="val" name="user">
            </p>
            <p>
                <input type="text" v-model="val">
            </p>
    
            <!--单选框 v-model 绑定的变量是单选框中某一个input的value-->
            <p>
                男:<input type="radio" v-model="r_val" value="male" name="sex">
                女:<input type="radio" v-model="r_val" value="female" name="sex">
            </p>
    
            <!--多选框 v-model绑定的变量是一个列表,列表存放0到任意一个复选框的value-->
            <p>
                足球:<input type="checkbox" v-model='c_val' name="h" value="s">
                篮球:<input type="checkbox" v-model="c_val" name="h" value="b">
                双色球:<input type="checkbox" v-model="c_val" name="h" value="d">
            </p>
    
            <button type="submit" >提交</button>
        </form>
    </div>
    // js
    
    <script>
        new Vue({
            el:'#app',
            data:{
                val:'',
                r_val:'male',     //默认值 默认选中男
                c_val:[],
    
            }
        })
    </script>
    8 条件指令

    v-show  根据条件展示元素的指令  v-show指令:闪烁一下是因为 v-show='s1'

         但是s1条件为假   然后是以  display:none渲染

      

      如果s1条件为真  就会真正的显示在那

      

      不同的是带有v-show 的元素始终会被渲染并保留在DOM中。 v-show 只是加单切换元素的css属性 display

     v-if  指令用于条件性渲染一块内容。这块内容只会在指令的表达式返回truthy值的时候被渲染

        

    <!--html-->
    
    <h1 v-if="awesome">Vue is awesome!</h1>

        因为v-if  是一个指令,所以必须将它添加到一个元素上。但是如果想切换多个元素呢?此时可以把一个<template>  元素当做不可见的包裹元素,并在上面使用 v-if 最终的渲染的结果将不包含<template>元素

    <!--html-->
    
    <template v-if="ok">
      <h1>Title</h1>
      <p>Paragraph 1</p>
      <p>Paragraph 2</p>
    </template>

    v-else-if  必须有条件 才也有条件v-if分支绑定

    v-else  会默认与v-if等有条件的分支的绑定

        <ul>
            <!--v-else会默认与v-if等有条件的分支绑定-->
            <!--v-else-if必须有条件才和有条件v-if分支绑定-->
    
            <li v-if="tag == 1">111</li>
            <li v-else-if="tag == 2">222</li>
            <li v-else>333</li>
        </ul>
    
        <ul>
            <li @click="action('a')">a</li>
            <li @click="action('b')">b</li>
            <li @click="action('c')">c</li>
        </ul>
        <ul>
            <li v-show="flag == 'a' ">aaa</li>
            <li v-show="flag == 'b' ">bbb</li>
            <li v-show="flag == 'c' ">ccc</li>
        </ul>
    
    </div>
    <script>
       new Vue({
            el: '#app',
            data: {
                num: 10,
                r1: false,
                r2: false,
                tag:2,
                flag:''
            },
           methods:{
                action:function (args) {
                    this.flag = args
                }
           }
    
        })
    </script>

    v-for  循环指令  可以遍历数组 可以遍历字典  索引可以做简单的运算 不建议计算复杂的

        <ul>
            <li v-for="num in nums">{{ num }}</li>  <!--只遍历值-->
        </ul>
        <ul>
            <li v-for="(num,index) in nums">{{ num }} {{ index }}</li>
            <hr>
            <li v-for="(num,index) in nums">{{ num }} {{ index +1 }}</li>
            <!--可以做简单的运算 不建议计算复杂的-->
        </ul>
        <ul>
            <li v-for="(v,k,i) in people">{{ v }} {{ k }} {{ i }}</li>
        </ul>
    <script>
        new Vue({
            el:'#app',
            data:{
                nums:[3,1,2,4,5,],
                people:{
                    'name':'owen',
                    'age':19,
                    'gender':'male'
                }
            }
        })
    </script>

    用key管理可复用性

    Vue 会尽可能高效地渲染元素,通常会复用已有元素而不是从头开始渲染。这么做除了使 Vue 变得非常快之外,还有其它一些好处。例如,如果你允许用户在不同的登录方式之间切换:

    <template v-if="loginType === 'username'">
      <label>Username</label>
      <input placeholder="Enter your username">
    </template>
    <template v-else>
      <label>Email</label>
      <input placeholder="Enter your email address">
    </template>

    那么在上面的代码中切换 loginType 将不会清除用户已经输入的内容。因为两个模板使用了相同的元素,<input> 不会被替换掉——仅仅是替换了它的 placeholder

    这样也不总是符合实际需求,所以 Vue 为你提供了一种方式来表达“这两个元素是完全独立的,不要复用它们”。只需添加一个具有唯一值的 key 属性即可:

    <template v-if="loginType === 'username'">
      <label>Username</label>
      <input placeholder="Enter your username" key="username-input">
    </template>
    <template v-else>
      <label>Email</label>
      <input placeholder="Enter your email address" key="email-input">
    </template>

    注意,<label> 元素仍然会被高效地复用,因为它们没有添加 key 属性。

  • 相关阅读:
    解决:UIBarButtonItem size issue.尺寸
    flutter坑:Android license status unknown and also Android sdkmanager tool not found
    Ream--(objc)写事务精简方案
    SDMask(iOS蒙层遮罩弹出引导)
    HIFIMAN TWS600A听感小记——测评出街Man
    imageRectForContentRect,titleRectForContentRect,contentRectForBounds,imageRectForContentRect什么时候调用
    super performSelector: 解决调用父类私有方法的问题
    解决:target overrides the `GCC_PREPROCESSOR_DEFINITIONS`
    swift为什么不是do while?
    记录/objc2/object_setClass做了啥
  • 原文地址:https://www.cnblogs.com/lakei/p/11093775.html
Copyright © 2020-2023  润新知