zoukankan      html  css  js  c++  java
  • vue学习

    01:MVC和MVVM的关系图解

     02:

    03:vue实例中data使用return包裹和不使用return包裹的区别

    在简单的vue实例中看到的Vue实例中data属性是如下方式展示的:

    let app= newVue({
    
    el:"#app",
    data:{
    msg:''
    },
    methods:{
    
    }
    })

    在使用组件化的项目中使用的是如下形式:

    export default{
    data(){
    return {
    showLogin:true,
    // def_act: '/A_VUE',
    msg: 'hello vue',
    user:'',
    homeContent: false,
    }
    },
    methods:{
    
    }
    }

    为何在大型项目中data需要使用return返回数据呢?
    答:不使用return包裹的数据会在项目的全局可见,会造成变量污染
    使用return包裹后数据中变量只在当前组件中生效,不会影响其他组件。


    04:v-cloak和v-text和v-html的区别和使用

    视频地址(十分钟左右):https://www.bilibili.com/video/av27969216?p=7

    05:### 事件修饰符:

    + .stop 阻止冒泡

    + .prevent 阻止默认事件

    + .capture 添加事件侦听器时使用事件捕获模式

    + .self 只当事件在该元素本身(比如不是子元素)触发时触发回调

    + .once 事件只触发一次

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <meta http-equiv="X-UA-Compatible" content="ie=edge">
      <title>Document</title>
      <script src="./lib/vue-2.4.0.js"></script>
      <style>
        .inner {
          height: 150px;
          background-color: darkcyan;
        }
    
        .outer {
          padding: 40px;
          background-color: red;
        }
      </style>
    </head>
    
    <body>
      <div id="app">
    
        <!-- 使用  .stop  阻止冒泡 -->
        <!-- <div class="inner" @click="div1Handler">
          <input type="button" value="戳他" @click.stop="btnHandler">
        </div> -->
    
        <!-- 使用 .prevent 阻止默认行为 -->
        <!-- <a href="http://www.baidu.com" @click.prevent="linkClick">有问题,先去百度</a> -->
    
        <!-- 使用  .capture 实现捕获触发事件的机制 -->
        <!-- <div class="inner" @click.capture="div1Handler">
          <input type="button" value="戳他" @click="btnHandler">
        </div> -->
    
        <!-- 使用 .self 实现只有点击当前元素时候,才会触发事件处理函数 -->
        <!-- <div class="inner" @click="div1Handler">
          <input type="button" value="戳他" @click="btnHandler">
        </div> -->
    
        <!-- 使用 .once 只触发一次事件处理函数 -->
        <!-- <a href="http://www.baidu.com" @click.prevent.once="linkClick">有问题,先去百度</a> -->
    
    
        <!-- 演示: .stop 和 .self 的区别 -->
        <!-- <div class="outer" @click="div2Handler">
          <div class="inner" @click="div1Handler">
            <input type="button" value="戳他" @click.stop="btnHandler">
          </div>
        </div> -->
    
        <!-- .self 只会阻止自己身上冒泡行为的触发,并不会真正阻止 冒泡的行为 -->
        <!-- <div class="outer" @click="div2Handler">
          <div class="inner" @click.self="div1Handler">
            <input type="button" value="戳他" @click="btnHandler">
          </div>
        </div> -->
    
      </div>
    
      <script>
        // 创建 Vue 实例,得到 ViewModel
        var vm = new Vue({
          el: '#app',
          data: {},
          methods: {
            div1Handler() {
              console.log('这是触发了 inner div 的点击事件')
            },
            btnHandler() {
              console.log('这是触发了 btn 按钮 的点击事件')
            },
            linkClick() {
              console.log('触发了连接的点击事件')
            },
            div2Handler() {
              console.log('这是触发了 outer div 的点击事件')
            }
          }
        });
      </script>
    </body>
    
    </html>
    代码示例

    06:## Vue指令之`v-model`和`双向数据绑定`

    v-bind 只能实现数据的单向绑定,从 M 自动绑定到 V, 无法实现数据的双向绑定

     使用 v-model 指令,可以实现 表单元素和 Model 中数据的双向数据绑定
    注意: v-model 只能运用在 表单元素中 

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <meta http-equiv="X-UA-Compatible" content="ie=edge">
      <title>Document</title>
      <script src="./lib/vue-2.4.0.js"></script>
    </head>
    
    <body>
      <div id="app">
        <h4>{{ msg }}</h4>
    
        <!-- v-bind 只能实现数据的单向绑定,从 M 自动绑定到 V, 无法实现数据的双向绑定  -->
        <!-- <input type="text" v-bind:value="msg" style="100%;"> -->
    
        <!-- 使用  v-model 指令,可以实现 表单元素和 Model 中数据的双向数据绑定 -->
        <!-- 注意: v-model 只能运用在 表单元素中 -->
        <!-- input(radio, text, address, email....)   select    checkbox   textarea   -->
        <input type="text" style="100%;" v-model="msg">
      </div>
    
      <script>
        // 创建 Vue 实例,得到 ViewModel
        var vm = new Vue({
          el: '#app',
          data: {
            msg: '大家都是好学生,爱敲代码,爱学习,爱思考,简直是完美,没瑕疵!'
          },
          methods: {
          }
        });
      </script>
    </body>
    
    </html>
    代码示例 v-model

     07:小项目-建议计算器

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <meta http-equiv="X-UA-Compatible" content="ie=edge">
      <title>Document</title>
      <script src="./lib/vue-2.4.0.js"></script>
    </head>
    
    <body>
      <div id="app">
        <input type="text" v-model="n1">
    
        <select v-model="opt">
          <option value="+">+</option>
          <option value="-">-</option>
          <option value="*">*</option>
          <option value="/">/</option>
        </select>
    
        <input type="text" v-model="n2">
    
        <input type="button" value="=" @click="calc">
    
        <input type="text" v-model="result">
      </div>
    
      <script>
        // 创建 Vue 实例,得到 ViewModel
        var vm = new Vue({
          el: '#app',
          data: {
            n1: 0,
            n2: 0,
            result: 0,
            opt: '+'
          },
          methods: {
            calc() { // 计算器算数的方法  
              // 逻辑:
              /* switch (this.opt) {
                case '+':
                  this.result = parseInt(this.n1) + parseInt(this.n2)
                  break;
                case '-':
                  this.result = parseInt(this.n1) - parseInt(this.n2)
                  break;
                case '*':
                  this.result = parseInt(this.n1) * parseInt(this.n2)
                  break;
                case '/':
                  this.result = parseInt(this.n1) / parseInt(this.n2)
                  break;
              } */
    
              // 注意:这是投机取巧的方式,正式开发中,尽量少用
              var codeStr = 'parseInt(this.n1) ' + this.opt + ' parseInt(this.n2)'
              this.result = eval(codeStr)
            }
          }
        });
      </script>
    </body>
    
    </html>
    简易计算器

      08:使用class样式

    0.html写法

     <h1 class="red thin">这是一个很大很大的H1,大到你无法想象!!!</h1> 

    1. 数组
    ```
    <h1 :class="['red', 'thin']">这是一个邪恶的H1</h1>
    ```

    2. 数组中使用三元表达式
    ```
    <h1 :class="['red', 'thin', isactive?'active':'']">这是一个邪恶的H1</h1>
    ```

    3. 数组中嵌套对象
    ```
    <h1 :class="['red', 'thin', {'active': isactive}]">这是一个邪恶的H1</h1>
    ```

    4. 直接使用对象
    ```
    <h1 :class="{red:true, italic:true, active:true, thin:true}">这是一个邪恶的H1</h1>
    ```

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <meta http-equiv="X-UA-Compatible" content="ie=edge">
      <title>Document</title>
      <script src="./lib/vue-2.4.0.js"></script>
      <style>
        .red {
          color: red;
        }
    
        .thin {
          font-weight: 200;
        }
    
        .italic {
          font-style: italic;
        }
    
        .active {
          letter-spacing: 0.5em;
        }
      </style>
    </head>
    
    <body>
      <div id="app">
        <!-- <h1 class="red thin">这是一个很大很大的H1,大到你无法想象!!!</h1> -->
    
        <!-- 第一种使用方式,直接传递一个数组,注意: 这里的 class 需要使用  v-bind 做数据绑定 -->
        <!-- <h1 :class="['thin', 'italic']">这是一个很大很大的H1,大到你无法想象!!!</h1> -->
    
        <!-- 在数组中使用三元表达式 -->
        <!-- <h1 :class="['thin', 'italic', flag?'active':'']">这是一个很大很大的H1,大到你无法想象!!!</h1> -->
    
        <!-- 在数组中使用 对象来代替三元表达式,提高代码的可读性 -->
        <!-- <h1 :class="['thin', 'italic', {'active':flag} ]">这是一个很大很大的H1,大到你无法想象!!!</h1> -->
    
        <!-- 在为 class 使用 v-bind 绑定 对象的时候,对象的属性是类名,由于 对象的属性可带引号,也可不带引号,所以 这里我没写引号;  属性的值 是一个标识符 -->
        <h1 :class="classObj">这是一个很大很大的H1,大到你无法想象!!!</h1>
    
    
      </div>
    
      <script>
        // 创建 Vue 实例,得到 ViewModel
        var vm = new Vue({
          el: '#app',
          data: {
            flag: true,
            classObj: { red: true, thin: true, italic: false, active: false }
          },
          methods: {}
        });
      </script>
    </body>
    
    </html>
    使用class样式

     09:使用class样式

    1. 直接在元素上通过 `:style` 的形式,书写样式对象
    <h1 :style="{color: 'red', 'font-size': '40px'}">这是一个善良的H1</h1>

    2. 将样式对象,定义到 `data` 中,并直接引用到 `:style` 中
    + 在data上定义样式:
    data: {
    h1StyleObj: { color: 'red', 'font-size': '40px', 'font-weight': '200' }
    }
    + 在元素中,通过属性绑定的形式,将样式对象应用到元素中:
    <h1 :style="h1StyleObj">这是一个善良的H1</h1>

    3. 在 `:style` 中通过数组,引用多个 `data` 上的样式对象
    + 在data上定义样式:
    data: {
    h1StyleObj: { color: 'red', 'font-size': '40px', 'font-weight': '200' },
    h1StyleObj2: { fontStyle: 'italic' }
    }
    + 在元素中,通过属性绑定的形式,将样式对象应用到元素中:
    <h1 :style="[h1StyleObj, h1StyleObj2]">这是一个善良的H1</h1>

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <meta http-equiv="X-UA-Compatible" content="ie=edge">
      <title>Document</title>
      <script src="./lib/vue-2.4.0.js"></script>
    </head>
    
    <body>
      <div id="app">
        <!-- 对象就是无序键值对的集合 -->
        <!-- <h1 :style="styleObj1">这是一个h1</h1> -->
    
        <h1 :style="[ styleObj1, styleObj2 ]">这是一个h1</h1>
      </div>
    
      <script>
        // 创建 Vue 实例,得到 ViewModel
        var vm = new Vue({
          el: '#app',
          data: {
            styleObj1: { color: 'red', 'font-weight': 200 },
            styleObj2: { 'font-style': 'italic' }
          },
          methods: {}
        });
      </script>
    </body>
    
    </html>
    内联样式

     09:Vue指令之`v-for`和`key`属性

    1. 迭代数组

    <ul>
    <li v-for="(item, i) in list">索引:{{i}} --- 姓名:{{item.name}} --- 年龄:{{item.age}}</li>
    </ul>

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <meta http-equiv="X-UA-Compatible" content="ie=edge">
      <title>Document</title>
      <script src="./lib/vue-2.4.0.js"></script>
    </head>
    
    <body>
      <div id="app">
        <!-- <p>{{list[0]}}</p>
        <p>{{list[1]}}</p>
        <p>{{list[2]}}</p>
        <p>{{list[3]}}</p>
        <p>{{list[4]}}</p> -->
    
        <p v-for="(item, i) in list">索引值:{{i}} --- 每一项:{{item}}</p>
    
      </div>
    
      <script>
        // 创建 Vue 实例,得到 ViewModel
        var vm = new Vue({
          el: '#app',
          data: {
            list: [1, 2, 3, 4, 5, 6]
          },
          methods: {}
        });
      </script>
    </body>
    
    </html>
    v-for循环普通数组

    2. 迭代对象中的属性

    <!-- 循环遍历对象身上的属性 -->

    <div v-for="(val, key, i) in userInfo">{{val}} --- {{key}} --- {{i}}</div>

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <meta http-equiv="X-UA-Compatible" content="ie=edge">
      <title>Document</title>
      <script src="./lib/vue-2.4.0.js"></script>
    </head>
    
    <body>
      <div id="app">
        <p v-for="(user, i) in list">Id:{{ user.id }} --- 名字:{{ user.name }} --- 索引:{{i}}</p>
      </div>
    
      <script>
        // 创建 Vue 实例,得到 ViewModel
        var vm = new Vue({
          el: '#app',
          data: {
            list: [
              { id: 1, name: 'zs1' },
              { id: 2, name: 'zs2' },
              { id: 3, name: 'zs3' },
              { id: 4, name: 'zs4' }
            ]
          },
          methods: {}
        });
      </script>
    </body>
    
    </html>
    v-for循环对象数组
    <!DOCTYPE html>
    <html lang="en">
    
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <meta http-equiv="X-UA-Compatible" content="ie=edge">
      <title>Document</title>
      <script src="./lib/vue-2.4.0.js"></script>
    </head>
    
    <body>
      <div id="app">
        <!-- 注意:在遍历对象身上的键值对的时候, 除了 有  val  key  ,在第三个位置还有 一个 索引  -->
        <p v-for="(val, key, i) in user">值是: {{ val }} --- 键是: {{key}} -- 索引: {{i}}</p>
      </div>
    
      <script>
        // 创建 Vue 实例,得到 ViewModel
        var vm = new Vue({
          el: '#app',
          data: {
            user: {
              id: 1,
              name: '托尼·屎大颗',
              gender: ''
            }
          },
          methods: {}
        });
      </script>
    </body>
    
    </html>
    v-for循环对象

    3. 迭代数字

    <!-- in 后面我们放过 普通数组,对象数组,对象, 还可以放数字 -->
    <!-- 注意:如果使用 v-for 迭代数字的话,前面的 count 值从 1 开始 -->

    <p v-for="i in 10">这是第 {{i}} 个P标签</p>

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <meta http-equiv="X-UA-Compatible" content="ie=edge">
      <title>Document</title>
      <script src="./lib/vue-2.4.0.js"></script>
    </head>
    
    <body>
      <div id="app">
        <!-- in 后面我们放过  普通数组,对象数组,对象, 还可以放数字 -->
        <!-- 注意:如果使用 v-for 迭代数字的话,前面的 count 值从 1 开始 -->
        <p v-for="count in 10">这是第 {{ count }} 次循环</p>
      </div>
    
      <script>
        // 创建 Vue 实例,得到 ViewModel
        var vm = new Vue({
          el: '#app',
          data: {},
          methods: {}
        });
      </script>
    </body>
    
    </html>
    v-for迭代数字

     > 2.2.0+ 的版本里,**当在组件中使用** v-for 时,key 现在是必须的。

    当 Vue.js 用 v-for 正在更新已渲染过的元素列表时,它默认用 “**就地复用**” 策略。如果数据项的顺序被改变,Vue将**不是移动 DOM 元素来匹配数据项的顺序**, 而是**简单复用此处每个元素**,并且确保它在特定索引下显示已被渲染过的每个元素。

    为了给 Vue 一个提示,**以便它能跟踪每个节点的身份,从而重用和重新排序现有元素**,你需要为每项提供一个唯一 key 属性。

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <meta http-equiv="X-UA-Compatible" content="ie=edge">
      <title>Document</title>
      <script src="./lib/vue-2.4.0.js"></script>
    </head>
    
    <body>
      <div id="app">
    
        <div>
          <label>Id:
            <input type="text" v-model="id">
          </label>
    
          <label>Name:
            <input type="text" v-model="name">
          </label>
    
          <input type="button" value="添加" @click="add">
        </div>
    
        <!-- 注意: v-for 循环的时候,key 属性只能使用 number获取string -->
        <!-- 注意: key 在使用的时候,必须使用 v-bind 属性绑定的形式,指定 key 的值 -->
        <!-- 在组件中,使用v-for循环的时候,或者在一些特殊情况中,如果 v-for 有问题,必须 在使用 v-for 的同时,指定 唯一的 字符串/数字 类型 :key 值 -->
        <p v-for="item in list" :key="item.id">
          <input type="checkbox">{{item.id}} --- {{item.name}}
        </p>
      </div>
    
      <script>
        // 创建 Vue 实例,得到 ViewModel
        var vm = new Vue({
          el: '#app',
          data: {
            id: '',
            name: '',
            list: [
              { id: 1, name: '李斯' },
              { id: 2, name: '嬴政' },
              { id: 3, name: '赵高' },
              { id: 4, name: '韩非' },
              { id: 5, name: '荀子' }
            ]
          },
          methods: {
            add() { // 添加方法
              this.list.unshift({ id: this.id, name: this.name })
            }
          }
        });
      </script>
    </body>
    
    </html>
    v-for循环key属性的使用

    10:## Vue指令之`v-if`和`v-show`

     一般来说,v-if 有更高的切换消耗而 v-show 有更高的初始渲染消耗。因此,如果需要频繁切换 v-show 较好,如果在运行时条件不大可能改变 v-if 较好。

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <meta http-equiv="X-UA-Compatible" content="ie=edge">
      <title>Document</title>
      <script src="./lib/vue-2.4.0.js"></script>
    </head>
    
    <body>
      <div id="app">
    
        <!-- <input type="button" value="toggle" @click="toggle"> -->
        <input type="button" value="toggle" @click="flag=!flag">
    
        <!-- v-if 的特点:每次都会重新删除或创建元素 -->
        <!-- v-show 的特点: 每次不会重新进行DOM的删除和创建操作,只是切换了元素的 display:none 样式 -->
    
        <!-- v-if 有较高的切换性能消耗 -->
        <!-- v-show 有较高的初始渲染消耗 -->
    
        <!-- 如果元素涉及到频繁的切换,最好不要使用 v-if, 而是推荐使用 v-show -->
        <!-- 如果元素可能永远也不会被显示出来被用户看到,则推荐使用 v-if -->
        <h3 v-if="flag">这是用v-if控制的元素</h3>
        <h3 v-show="flag">这是用v-show控制的元素</h3>
    
      </div>
    
      <script>
        // 创建 Vue 实例,得到 ViewModel
        var vm = new Vue({
          el: '#app',
          data: {
            flag: false
          },
          methods: {
            /* toggle() {
              this.flag = !this.flag
            } */
          }
        });
      </script>
    </body>
    
    </html>
    v-if和v-show使用
  • 相关阅读:
    maven项目中各文件都没有报错,但是项目名称有红叉
    executeFind()方法和execute()方法区别
    数据库查询
    getHibernateTemplate出现的所有find方法的总结
    HQL和SQL的区别
    Java创建对象的方式
    xml中的<![CDATA[]]>和转义字符
    DWRUtil.addOptions
    dwr
    response.setHeader("Cache-Control","no-cache");的作用
  • 原文地址:https://www.cnblogs.com/package-java/p/11365934.html
Copyright © 2011-2022 走看看