理理Vue细节(推荐)


Posted in Javascript onApril 16, 2019

 1. 动态属性名:可使用表达式来设置动态属性名或方法名:

<!-- 属性name -->
<a :[name]="url"> ... </a>
<!-- 计算属性sss和s -->
<img :[sss]="/img/test.png"/> 
<!-- 方法change1和change2 -->
<img :[change1()]="change2()"/>

data: {
  name: 'href',
  sss: 'src'
}

注意:要避免空格和引号等,且需要小写,可使用计算属性来应对复杂表达式,都需要使用[]

2. computed/methods/watch

computed可使用get/set

computed: {
    top() {
      return 'top'
    },
    name: {
      get () {
        return this.name
      },
      set (val) {
        this.name = val
      }
    }
  }

computed可缓存,但不可传参,会根据data中的属性变化而变化,即是根据响应式依赖来变化,而Date不是响应式依赖,即不会变化;method则每次都会进行计算,但可传参。

watch用于处理异步或开销较大的操作,如输入搜索时。

3. style绑定

  1. 直接对象或变量对象
  2. 计算属性
  3. 直接style或style对象
<!-- 属性名可加引号也可不加,属性小驼峰 -->
<div :style="{ 'color': 'red', fontSize: fontSize + 'px' }">样式3</div>
  1.  数组结合三目/数组结合对象
data: {
 isActive: true,
 activeClass: 'active'
}
<!-- 使用数组时变量和字符串需要通过引号来区分 -->
<div :class="[isActive ? activeClass : '', 'errorClass']"></div>
<!-- 使用对象时类名不加引号可表示变量也可表示字符串 -->
<div :class="[{ active: isActive }, 'errorClass']"></div>

 4. v-if条件渲染

可使用template包裹元素,template会被当成不可见的包裹元素

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

多条件判断

<div v-if="type === 'A'">
 A
</div>
<div v-else-if="type === 'B'">
 B
</div>
<div v-else-if="type === 'C'">
 C
</div>
<div v-else>
 Not A/B/C
</div>

5. key

添加key防止vue重复利用不想被重复利用的元素,如下的input如果不添加key,则vue会重复使用key,进而input的value值在切换后还会被保留,因为vue仅仅替换了placeholder

<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>

6. v-if和v-show

v-if是组件的销毁和重建,如果初始条件为false,则什么都不做,直到变为真,所以切换开销高,运行条件很少改变时适用
v-show是display:none和block之间的CSS切换,基于渲染,不管初始条件如何都会渲染,所以初始渲染开销高,切换频率高时适用

7. v-for

  1. 可使用in或者of
  2. 也可遍历对象:v-for="(value, key, index) in obj"
  3. 可根据template渲染多个组合元素:
<ul>
 <template v-for="item in items">
  <li>{{ item.msg }}</li>
  <li class="divider"></li>
 </template>
</ul>

8. v-for和v-if

v-for优先级更高,所以v-if会重复运行于每个v-for循环中,所以尽量不要一起使用,可先使用计算属性对数据进行过滤再遍历。

9. 更改响应式数据

  1. Vue.set(object, key, value)
  2. this.$set(object, key, value)
  3. this.items.splice(index, 1, newValue)
  4. 批量添加属性:
// 不要直接Object.assign(this.items, {age: 18}
this.items = Object.assign({}, this.items, {
 age: 18,
 favoriteColor: 'Vue Green'
})

10. 事件修饰符

  1. .passive:滚动的默认事件会立即出发,即告诉浏览器不想阻止默认事件的触发,可提升移动端性能
<div :scroll.passive="onScroll">...</div>
  1. .capture:添加事件监听器时使用事件捕获模式,即元素自身触发的事件先在此处理,然后才交由内部元素进行处理
  2. .self:只当在 event.target 是当前元素自身时触发处理函数,即事件不是从内部元素触发的
  3. .once:点击事件只会触发一次
  4. 键盘修饰符:<input v-on:keyup.enter="submit">

11. v-model

选择框

<!-- 单选框时,picked为字符串 "a",不是布尔值 -->
<input type="radio" value="a" v-model="picked">

<!-- 多选框时,toggle默认值设为字符串或布尔值时得到布尔值,设为数组时得到的是value值-->
<input type="checkbox" value="b" v-model="toggle">

<!-- 当选中第一个选项时,selected为字符串value的值 "abc" -->
<select v-model="selected">
 <option value="abc">ABC</option>
</select>

修饰符.lazy:在change时而非input时更新 <input v-model.lazy="msg" >

注:change事件是在input失去焦点时触发,即用于单选、多选框和选择框,而input事件是在value值变化时触发,但脚本改变value值时不会触发,即用于text和textarea

修饰符.number:输入值转为数值

修饰符.trim:过滤收尾空白字符

12. Prop

使用v-bind="obj"会将对象的每个属性都作为一个独立的prop传入进去,所以接受时也需要逐个属性接收。

<test v-bind="obj"></test>

props虽然是单向数据流,但对于引用类型,子组件还是可以改变父组件的状态。

props会在组件实例创建之前进行验证,所以实例的属性再default或validator中是不可用的。

13. 自定义事件

自定义事件需要注意事件名为小写或-分隔,因为$emit('BaseEvent')虽然事件名不会变,但在html中该事件名会被转化为小写,不会监听到。

14. slot

具名插槽

<base-layout>
 <template v-slot:header>
  <h1>Here might be a page title</h1>
 </template>
<!-- 默认插槽也可不用加上template和v-slot -->
 <template v-slot:default>
  <p>A paragraph for the main content.</p>
  <p>And another one.</p>
 </template>
 <template v-slot:footer>
  <p>Here's some contact info</p>
 </template>
</base-layout>

作用域插槽

<!-- current-user组件 -->
<span>
 <slot :user="user">
  {{ user.lastName }}
 </slot>
</span>

<!-- 父级组件通过自定义名称访问子级作用域 -->
<current-user>
 <template v-slot:default="slotProps">
  {{ slotProps.user.firstName }}
 </template>
</current-user>

<!-- 支持缩写和解构 -->
<current-user>
 <template #default="{ user = { firstName: Gust } }">
  {{ user.firstName }}
 </template>
</current-user>

15. 组件通信

  1. vuex/eventBus
  2. prop/$emit
  3. $children/$parent
  4. provide/inject
  5. $refs
// 父或祖先级
provide: function () {
 return {
  getMap: this.getMap
 }
}

// 后代级
inject: ['getMap']

 16. scope

scoped 属性会自动添加一个唯一的属性 (比如 data-v-21e5b78) 为组件内 CSS 指定作用域,编译的时候 .list-container:hover 会被编译成类似 .list-container[data-v-21e5b78]:hover

17. 路由

区分:this.$router指路由器,this.$route指当前路由

通配符:捕获所有路由或 404 Not found路由

// 含通配符的路由都要放在最后,因为优先级由定义顺序决定
{
 // 会匹配所有路径
 path: '*'
}
{
 // 会匹配以 `/user-` 开头的任意路径
 path: '/user-*'
}

当使用一个通配符时,$route.params内会自动添加一个名为 pathMatch 参数。它包含了 URL 通过通配符被匹配的部分:

// 给出一个路由 { path: '/user-*' }
this.$router.push('/user-admin')
this.$route.params.pathMatch // 'admin'
// 给出一个路由 { path: '*' }
this.$router.push('/non-existing')
this.$route.params.pathMatch // '/non-existing'

点击 <router-link :to="..."> 等同于调用 router.push(...)方法,因为<router-link>会在内部调用该方法,进而在history栈添加一个新的记录

使用了push时,如果提供的path不完整,则params会被忽略,需要提供路由的 name 或手写完整的带有参数的 path:

const userId = '123'
router.push({ name: 'user', params: { userId }}) // -> /user/123
router.push({ path: `/user/${userId}` })     // -> /user/123
// 这里的 params 不生效
router.push({ path: '/user', params: { userId }}) // -> /user

router.push/router.replace/router.go 效仿于 window.history.pushState/window.history.replaceState/window.history.go

命名视图:router-view可设置名字,如果router-view没有设置名字,那么默认为 default

<router-view></router-view>
<router-view name="a"></router-view>
<router-view name="b"></router-view>

const router = new VueRouter({
 routes: [
  {
   path: '/',
   components: {
    default: Foo,
    a: Bar,
    b: Baz
   } 
  }
 ]
})

路由使用props:可将路由参数设置为组件属性

const User = {
 props: ['id'],
 template: '<div>User {{ id }}</div>'
}
// 通过布尔值设置
const router = new VueRouter({
 routes: [
  { path: '/user/:id', component: User, props: true },

  // 对于包含命名视图的路由,你必须分别为每个命名视图添加 `props` 选项:
  {
   path: '/user/:id',
   components: { default: User, sidebar: Sidebar },
   props: { default: true, sidebar: false }
  }
 ]
})

// 通过函数设置query 
// URL /search?q=vue 会将 {name: 'vue'} 作为属性传递给 SearchUser 组件
const router = new VueRouter({
 routes: [
  { path: '/search', component: SearchUser, props: (route) => ({ name: route.query.q }) }
 ]
})

beforeRouteEnter:可使用beforeRouteEnter来提前获取接口数据,同时需要在next后才能访问到实例:

beforeRouteEnter(to, from, next) {
 axios('/text.json').then(res => {
  next(vm => {
   vm.datas = res
  })
 })
}

路由设置有参数时,如果跳转页面后再通过返回键返回时,路由会保留有参数,如果通过push跳转返回,则不会保留该参数,这在第三方调用模块传参时需要注意。

18. loader

Vue Loader编译单文件的template块时,会将所有遇到的URL资源转为webpack模块请求:

// <img src="../image.png">将会被编译成为:
createElement('img', {
 attrs: {
  src: require('../image.png') // 现在这是一个模块的请求了
 }
})

资源URL转换规则

  1. 如果是绝对路径,例如 /images/foo.png),则会原样保留。
  2. 如果路径以.开头,将会被看作相对的模块依赖,并按照你的本地文件系统上的目录结构进行解析。
  3. 如果路径以~开头,其后的部分将会被看作模块依赖。
  4. 如果路径以 @ 开头,也会被看作模块依赖。

以上所述是小编给大家介绍的Vue细节详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
jscript之List Excel Color Values
Jun 13 Javascript
JavaScript中的Document文档对象
Jan 16 Javascript
javascript SocialHistory 检查访问者是否访问过某站点
Aug 02 Javascript
Riot.js 快速的JavaScript单元测试框架
Nov 09 Javascript
基于KMP算法JavaScript的实现方法分析
May 03 Javascript
解析Javascript中中括号“[]”的多义性
Dec 03 Javascript
jQuery中fadeOut()方法用法实例
Dec 24 Javascript
JS实现表单多文件上传样式美化支持选中文件后删除相关项
Sep 30 Javascript
微信JSAPI支付操作需要注意的细节
Jan 10 Javascript
JavaScript中 DOM操作方法小结
Apr 25 Javascript
Material(包括Material Icon)在Angular2中的使用详解
Feb 11 Javascript
vue组件入门知识全梳理
Sep 21 Javascript
ES6知识点整理之Proxy的应用实例详解
Apr 16 #Javascript
js实现删除li标签一行内容
Apr 16 #Javascript
js实现弹出框的拖拽效果实例代码详解
Apr 16 #Javascript
重学 JS:为啥 await 不能用在 forEach 中详解
Apr 15 #Javascript
你不知道的Vue技巧之--开发一个可以通过方法调用的组件(推荐)
Apr 15 #Javascript
详解JavaScript中的强制类型转换
Apr 15 #Javascript
一个小时快速搭建微信小程序的方法步骤
Apr 15 #Javascript
You might like
PHP中使用foreach和引用导致程序BUG的问题介绍
2012/09/05 PHP
php类常量的使用详解
2013/06/08 PHP
PHP CURL获取返回值的方法
2014/05/04 PHP
利用PHP获取访客IP、地区位置、浏览器及来源页面等信息
2017/06/27 PHP
PHP实现登录注册之BootStrap表单功能
2017/09/03 PHP
Laravel 5使用Laravel Excel实现Excel/CSV文件导入导出的功能详解
2017/10/11 PHP
用JS实现的一个include函数
2007/07/21 Javascript
ExtJS DOM元素操作经验分享
2013/08/28 Javascript
把jQuery的类、插件封装成seajs的模块的方法
2014/03/12 Javascript
Javascript基础教程之数组 array
2015/01/18 Javascript
jquery中change()用法实例分析
2015/02/06 Javascript
浅谈javascript实现八大排序
2015/04/27 Javascript
jQuery实现强制cookie过期方法汇总
2015/05/22 Javascript
基于JavaScript实现快速转换文本语言(繁体中文和简体中文)
2016/03/07 Javascript
微信小程序实现拖拽 image 触摸事件监听的实例
2017/08/17 Javascript
关于Vue单页面骨架屏实践记录
2017/12/13 Javascript
vue :src 文件路径错误问题的解决方法
2018/05/15 Javascript
python使用append合并两个数组的方法
2015/04/28 Python
Python使用ntplib库同步校准当地时间的方法
2016/07/02 Python
python实现隐马尔科夫模型HMM
2018/03/25 Python
关于python写入文件自动换行的问题
2018/06/23 Python
基于随机梯度下降的矩阵分解推荐算法(python)
2018/08/31 Python
python 切换root 执行命令的方法
2019/01/19 Python
Django REST framwork的权限验证实例
2020/04/02 Python
python的链表基础知识点
2020/09/13 Python
html5调用摄像头功能的实现代码
2018/05/07 HTML / CSS
Html5 new XMLHttpRequest()监听附件上传进度
2021/01/14 HTML / CSS
阿波罗盒子:Apollo Box
2017/08/14 全球购物
耐克波兰官方网站:Nike波兰
2019/09/03 全球购物
高级文秘工作总结的自我评价
2013/09/28 职场文书
先进个人获奖感言
2014/01/24 职场文书
教师党员岗位承诺书
2014/05/29 职场文书
反腐倡廉标语
2014/06/24 职场文书
公务员年度考核个人总结
2015/02/12 职场文书
2015年班级工作总结范文
2015/04/03 职场文书
怎样评估创业计划书是否有可行性?
2019/08/07 职场文书