2020-06-16 Vue

指令-v-bind绑定class

作用:操作类名

想法:class属性是由多个类组成,使用对象或者数组

绑定对象:

  • 语法:<div :class="{类名:是否添加该类名,...}"></div>
  • 例如:<div :class="{btn:true,red:false}"></div>
    <style>
      .bg{
        background: pink;
      }
      .red {
        color: red;
      }
    </style>
  </head>
  <body>
    <div id="app">
      <!-- 基本写法 -->
      <!-- <div :class="{bg:false,red:false}">使用对象操作类名</div> -->
      <!-- 通过数据来控制 单独控制-->
      <!-- <div :class="{bg:hasBg,red:hasRed}">使用对象操作类名</div> -->
      <!-- 通过数据来控制 完整控制 -->
      <button @click="classObject.bg=true">加bg</button>
      <button @click="classObject.red=true">加red</button>
      <div :class="classObject">使用对象操作类名</div>
    </div>
    <script src="./vue.js"></script>
    <script>
      const vm = new Vue({
        el: '#app',
        data: {
          // hasBg: false,
          // hasRed: false
          classObject: {
            bg: false,
            red: false
          }
        },
        methods: {}
      })
    </script>
  </body>

绑定数组:

  • 语法:<div :class="['类名1','类名2']"></div>
  • 例子:<div :class="['bg','red']"></div>
      <!-- 基本写法 -->
      <!-- <div :class="['bg','red']">使用数组操作类名</div> -->
      <button @click="classArray.push('bg')">加bg</button>
      <button @click="classArray.push('red')">加red</button>
      <div :class="classArray">使用数组操作类名</div>
        data: {
          // hasBg: false,
          // hasRed: false
          classObject: {
            bg: false,
            red: false
          },
+          classArray: []
        },

补充:

  • 如果既有 class 又有 :class 是什么效果
  • class是默认类名,:class产生的类名会进行合并。

总结:

  • v-bind绑定class可以使用对象可以使用数组进行操作。
  • :class="{类名:是否加类名}"
  • :class="['类名']"

指令-v-bind绑定style

作用:通过vue的方式动态修改行内样式,也就是style属性。

想法:style属性是由多个css样式组成的,可使用对象,可使用数组。

使用对象绑定:

  • 语法:<div :style="{color:'red',fontSize:'20px'}" ></div>
    • 如果属性中包含 - 符号
      • 'font-size' 字符表示
      • fontSize 遵循驼峰
    <div id="app">
      <!-- 基本写法 -->
      <!-- <div :style="{color:'red',fontSize:'20px'}">使用对象绑定style</div> -->
      <!-- 动态绑定 -->
      <button @click="objectStyle.color='pink'">加bg</button>
      <button @click="objectStyle.fontSize='100px'">加red</button>
      <div :style="objectStyle">使用对象绑定style</div>
    </div>
    <script src="./vue.js"></script>
    <script>
      const vm = new Vue({
        el: '#app',
        data: {
          // 对象style样式
          objectStyle: {color:'red',fontSize:'20px',backgroundColor:'none'}
        },
        methods: {}
      })
    </script>

使用数组绑定:

  • 语法:<div :style="[{color:'red'},{fontSize:'20px'}]" ></div>
  • 如果属性中包含 - 符号
    • 'font-size' 字符表示
    • fontSize 遵循驼峰
      <!-- 基本写法 -->
      <!-- <div :style="[{color:'blue'},{fontSize:'30px'}]">使用数组绑定style</div> -->
      <!-- 动态绑定 -->
      <button @click="arrayStyle.push({color:'blue'})">加颜色</button>
      <button @click="arrayStyle.push({fontSize:'30px'})">加字体大小</button>
      <div :style="arrayStyle">使用数组绑定style</div>
        data: {
          // 对象style样式
          objectStyle: {color:'red',fontSize:'20px',backgroundColor:'none'},
          // 数组style样式
+          arrayStyle: []
        },

疑问:

  • 标签上同时存在 style :style 结果是?
  • 如果有一样的样式,会发生覆盖,不同的就追加。

总结:写法

  • :style="{csss属性:css属性值,...}"
  • :style="[{csss属性:css属性值,...}]"
  • css属性值最好遵循驼峰命名,或者用引号包起来。

指令-v-model

1、知道v-model的语法糖原理

  • 双向:
    • 数据到视图(把data中的数据赋值给表单元素) M->V
    • 视图到数据(当表单元素的内容发生改变的时候,获取改变的值修改data中的数据) V->M
      不使用v-model实现双向绑定
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title></title>
  </head>
  <body>
    <div id="app">
      <h1>{{msg}}</h1>
      <!-- 不使用v-model -->
      <!-- 1. data中数据赋值给表单元素  v-bind:value="msg" -->
      <!-- 2. 当表单元素值改变后,获取其值去修改data中的数据-->
      <!-- 2.1 使用input事件监听值改变 -->
      <!-- 2.2 获取值通过dom对象获取value属性值 -->
      <!-- 2.3 把最新的值去修改data中的数据-->
      <input type="text" :value="msg" @input="msg=$event.target.value">
      <!-- 总结:v-model的语法糖原理是 使用:value赋值,使用@input改值 -->
    </div>
    <script src="./vue.js"></script>
    <script>
      const vm = new Vue({
        el: '#app',
        data: {
          msg: 'hi vue'
        },
        methods: {
          // fn (e) {
          //   // e.target 是事件触发源  当前的input标签
          //   // e.target.value 就是输入的值
          //   // console.log(e.target.value)
          //   this.msg = e.target.value
          // }
        }
      })
    </script>
  </body>
</html>

总结:v-model的语法糖原理是 使用:value赋值,使用@input改值

2、其他表单元素如何进行绑定

  • 输入框
  • 下拉框
  • 复选框
  • 单选框
  • 文本域
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title></title>
  </head>
  <body>
    <div id="app">
      <!-- 输入框 -->
      <input type="text" v-model="str">
      <hr>
      <!-- 下拉框 -->
      <select v-model="subject">
        <!-- :value目的是让数值解析 number -->
        <option :value="1">前端</option>
        <option :value="2">java</option>
        <option :value="3">UI</option>
      </select>
      <hr>
      <!-- 复选框 -->
      <!-- 1. 单个复选框  表示布尔类型的值  true 选中 false 不选中 -->
      <input type="checkbox" v-model="isChecked">
      <hr>
      <!-- 2. 多个复选框 -->
      <input type="checkbox" value="book" v-model="hobby"> 书籍
      <input type="checkbox" value="ball" v-model="hobby"> 球类
      <input type="checkbox" value="game" v-model="hobby"> 游戏
      <hr>
      <!-- 单选框 -->
      <input type="radio" value="男" v-model="gender"> 男
      <input type="radio" value="女" v-model="gender"> 女
      <!-- 文本域 -->
      <hr>
      <textarea v-model="text"></textarea>
    </div>
    <script src="./vue.js"></script>
    <script>
      const vm = new Vue({
        el: '#app',
        data: {
          str: '输入框',
          subject: '',
          isChecked: false,
          hobby: [],
          gender: '男',
          text: '文本域'
        },
        methods: {}
      })
    </script>
  </body>
</html>

注意:多个复选框绑定的值是数组

指令-v-cloak

问题:模板(视图)中会使用插值表达式,在vue没有解析前{{}},解析后才是正常的内容。

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title></title>
    <style>
      [v-cloak] {
        display: none;
      }
    </style>
  </head>
  <body>
    <div id="app" v-cloak>
      <h1>{{msg}}</h1>
    </div>
    <script src="./vue.js"></script>
    <script>
      // 思考:先让模板隐藏,当解析完毕后显示
      // 指令:v-cloak给容器添加,当解析完毕后v-cloak指令被移除。

      const vm = new Vue({
        el: '#app',
        data: {
          msg: '你好'
        },
        methods: {}
      })
    </script>
  </body>
</html>

总结:

  • v-cloak指令在解析后会移除
  • 写一个隐藏样式
      [v-cloak] {
        display: none;
      }

指令-v-once

认知:

  • 在模板中使用一个数据,如果有多处使用这个数据,当数据发生变化的时候,所有使用数据的位置都会更新。

  • 可以让某一次内容只渲染一次

场景:

  • 计数器(每点一次加一),显示初始值。
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title></title>
  </head>
  <body>
    <div id="app">
      <div v-once>初始值:{{count}}</div>
      <div>累加值:{{count}}</div>
      <button @click="count++">加一</button>
    </div>
    <script src="./vue.js"></script>
    <script>
      const vm = new Vue({
        el: '#app',
        data: {
          count: 100
        },
        methods: {}
      })
    </script>
  </body>
</html>

总结:v-once让某一处只渲染一次,不受数据改变的影响。

vue定义过滤器

目的:掌握使用过滤器完成常见的数据格式转换

作用:

  • 在插值表达式中使用,可以对输出的内容进行格式的转换。

定义:

  • 全局定义(在任何vue实例管理的视图中都可使用)
    • 语法 Vue.filter('过滤器名称',处理格式函数(val){ //val就行需要转换的值 //对val进行处理 //处理好的数据return出去即可 })
  • 局部定义(仅仅在当前定义过滤器的vue实例中使用)
    • 语法 new Vue({filters:{'过滤器名称':处理格式函数(val){ //val就行需要转换的值 //对val进行处理 //处理好的数据return出去即可 }}})

使用:

  • 模板中进行使用 {{数据字段|过滤器名称}}

代码:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title></title>
  </head>
  <body>
    <div id="app">
      <!-- 输出十位数的编号,不够十位往前补0 -->
      <h1>{{num|formatNum(20)}}</h1>
      <h1>{{num|privateFilter}}</h1>
    </div>
    <hr>
    <div id="app2">
      <h1>{{count|formatNum}}</h1>
      <!-- <h1>{{count|privateFilter}}</h1> -->
    </div>
    <script src="./vue.js"></script>
    <script>

      // 全局过滤器
      // 处理函数(默认参数,自己传参) 补齐几位自己决定
      Vue.filter('formatNum',(val, total) => {
        // 如果没有传参默认十位
        total = total || 10
        // val 使用过滤器的时候 | 前的js表达式的执行结果
        // | 术语:管道符
        // 1. 处理格式
        // 2. 返回结果(在插值表达式中输出)
        // 字符串的padStart(得到几位字符串,不够位数补齐的字符) 往前补齐
        // 字符串的padEnd(得到几位字符串,不够位数补齐的字符) 往后补齐
        return String(val).padStart(total, 0)
      })  

      const vm = new Vue({
        el: '#app',
        data: {
          num: 101
        },
        methods: {},
        // 局部过滤器
        filters: {
          'privateFilter': (val) => {
            // 逻辑往后补零
            return String(val).padEnd(10,0)
          }
          // Failed to resolve filter: privateFilter
          // 在其他视图中使用报错
        }
      })

      // 其他实例
      new Vue({
        el: '#app2',
        data: {
          count: 222
        }
      })
    </script>
  </body>
</html>

总结:

  • 全局的 Vue.filter(过滤器名称,处理函数)
  • 局部的 new Vue({filters:{过滤器名称:处理函数}})
  • 如果有参数处理 num|formatNum(20)
  • 处理函数里面一定要return

vue操作dom

vue中获取dom的方式:

  • 首先,给你想获取dom的容器上加上一个ref属性
  • 然后,ref有属性值,定义一个字符串作为标识(联想成给了个ID)
  • 最后,在vue实例中有一个属性$refs
    • $refs它收集了视图中使用ref标识过的所有dom对象
<div ref="myDiv">dom容器</div>
// $refs === {myDiv:'dom对象',。。。}
const dom = this.$refs.myDiv 
  • ref属性的值,就是将来拿dom的键

栗子代码:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title></title>
  </head>
  <body>
    <div id="app">
      <button @click="getWidth()">获取宽度</button>
      <div ref="container">我是一个容器</div>
      <!-- 特殊情况 -->
      <ul>
        <li ref="lis" v-for="i in 3">我是第{{i}}个LI</li>
      </ul>
    </div>
    <script src="./vue.js"></script>
    <script>
      const vm = new Vue({
        el: '#app',
        data: {},
        methods: {
          getWidth () {
            // console.log(this.$refs)  {container:div对象}
            console.log('容器宽度:'+ this.$refs.container.offsetWidth)
            // 通过 this.$refs.lis 获取的是什么?
            // 获取到的是数组  [dom1,dom2,dom3]
            // 获取其中某一个 根据索引获取即可
            console.log(this.$refs.lis)
          }
        }
      })
    </script>
  </body>
</html>

补充:

  • 目前我们没有学习过组件
  • ref给原生的标签添加后,获取的是dom元素 (掌握)
  • ref给vue的组件添加后,获取的是组件实例
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • vue是什么 官网地址: https://cn.vuejs.org/官方解释:渐进式javascript框架 区别...
    汐埋罗傲阅读 298评论 0 0
  • Vue Vue是一个前端js框架,由尤雨溪开发,是个人项目 Vue近几年来特别的受关注,三年前的时候angular...
    hcySam阅读 304评论 0 0
  • Vue 实例 属性和方法 每个 Vue 实例都会代理其 data 对象里所有的属性:var data = { a:...
    云之外阅读 2,273评论 0 6
  • 一、简介 1、 Vue.js 是什么 参考网址:https://cn.vuejs.org/v2/guide/ind...
    满天繁星_28c5阅读 507评论 0 1
  • Vue真是太好了 壹万多字的Vue知识点 超详细! 9 ️1⃣️、Vue和其他两大框架的区别 Angular 学习...
    三千繁夢阅读 360评论 0 0