-
Object.assign()
方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。
语法
Object.assign(target, ...sources)
具体请参考:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/assign
-
数组的空位
数组的空位指,数组的某一个位置没有任何值。比如,Array构造函数返回的数组都是空位。
Array(3) // [, , ,]
上面代码中,Array(3)返回一个具有3个空位的数组。
注意,空位不是undefined,一个位置的值等于undefined,依然是有值的。空位是没有任何值,in运算符可以说明这一点。
0 in [undefined, undefined, undefined] // true
0 in [, , ,] // false
上面代码说明,第一个数组的0号位置是有值的,第二个数组的0号位置没有值。
参考:http://es6.ruanyifeng.com/#docs/array
-
fastclick
和better-scroll
点击冲突,只需要给被点击的元素添加一个类:class="needsclick"
, 最新版本的better-scroll
已经解决了这个问题,不用再加class="needsclick"
。
如:给img标签添加class="needsclick"
-
数组根据标题首字母排序
ret.sort((a, b) => {
return a.title.charCodeAt(0) - b.title.charCodeAt(0)
})
参考:http://www.w3school.com.cn/jsref/jsref_charCodeAt.asp
以及:music 歌手页面
-
通过
map
获取一个新的集合数组
computed: {
shortcutList() {
//group:获取到的每一个对象
return this.data.map((group) => {
//从0开始,截取一个字符
return group.title.substr(0, 1)
})
}
},
-
数组过滤 filter()
computed: {
/* 计算出推荐的数组 */
positives() {
return this.ratings.filter((rating) => {
return rating.rateType === POSITIVE;
});
},
/* 计算出吐槽的数组 */
negatives() {
return this.ratings.filter((rating) => {
return rating.rateType === NEGATIVE;
});
}
},
-
@touch 触碰事件
- {{item}}
-
event.target 事件属性可返回事件的目标节点(触发该事件的节点),如生成事件的元素、文档或窗口。
下面的例子可获得触发事件的元素:
Click on this paragraph. An alert box will
show which element triggered the event.
-
Vue.js 定义一个变量,若不想被系统添加set和get方法,可以定义在
created()
钩子里面
这样,系统就不会去观测该变量值的改变,从而影响双向绑定
created() {
this.touch = {}
......
}
-
better-scroll
scrollToElement(), 第一个参数指的是节点,第二个参数:动画时间
下面的例子中,0指的是动画时间为0
这个默认把你所在的那一行滚动到顶部位置!!!
this.$refs.listview.scrollToElement(this.$refs.listGroup[index], 0)
-
methods 方法书写规范
公共方法放在上面,
私有的方法放在下面.
如下图:
methods: {
refresh() {
......
},
scroll(pos) {
......
},
_calculateHeight() {
......
},
_scrollTo(index) {
......
}
},
-
数据的变化,到dom的变化,大概耗时17ms
所以,一般倒计时20ms
后执行需要操作的函数。
watch: {
data() {
setTimeout(() => {
this._calculateHeight()
}, 20)
}
}
-
better-scroll
的probeType属性默认是1,如果想要在scroll快速滚动的时候,正确的监听scroll,需把该属性设置为3。 -
设置background-image:url( ),最好写在行内样式里面,不要写在css里.
计算属性:
computed: {
bgStyle() {
return `background-image:url(${this.bgImage})`
}
},
-
this.$refs.list.$el.style.top = ${this.imageHeight}px
vm.$el : Vue 实例使用的根 DOM 元素, 类型:HTMLElement
-
Math.max(x...) 返回两个指定的数中带有较大的值的那个数。
Math.PI * 2r : 获取圆的周长
-
js修改样式时,则需要把webkit-xxx
也写上,也可以单独封装来实现autoprefix
效果,如: vue-music
注意: width,height 除外
this.$refs.filter.style['backdrop-filter'] = `blur(${blur}px)`
this.$refs.filter.style['webkitBackdrop-filter'] = `blur(${blur}px)`
封装, 创建一个js文件
let elementStyle = document.createElement('div').style
let vendor = (() => {
let transformNames = {
webkit: 'webkitTransform',
Moz: 'MozTransform', // 火狐
O: 'OTransform', // 欧朋
ms: 'msTransform', // IE
standard: 'transform'
}
for (let key in transformNames) {
if (elementStyle[transformNames[key]] !== undefined) {
return key
}
}
return false
})()
// 在外边调用该方法
export function prefixStyle(style) {
if (vendor === false) {
return false
}
if (vendor === 'standard') {
return style
}
// vendor 浏览器厂家
// style.charAt(0).toUpperCase() + style.substr(1) 首字母大写
return vendor + style.charAt(0).toUpperCase() + style.substr(1)
}
在外边直接调用prefixStyle()函数
-
vue-router 按钮返回上一个界面
this.$router.back()
-
push到子路由
this.$router.push({
path: `/singer/${singer.id}` // ${singer.id} 为传递的参数
})
-
Vuex 在传递参数时的使用
- 先在父界面,引入mapMutations 语法糖
import {mapMutations} from 'vuex'
- 在该界面methods中代理该
...mapMutations
语法糖 methods: {
...mapMutations({
setSinger: 'SET_SINGER'
})
}
- push界面时,调用上面的
setSinger
this.setSinger(singer)
- 在使用该参数的界面,先引入mapGetters语法糖
import {mapGetters} from 'vuex'
- 在计算属性中实现...mapGetters()语法糖
computed: {
...mapGetters([
'singer'
])
}
- 最后就可以愉快的使用了
this.singer.id 或者 singer.id 看情况决定是否使用this调用
-
创建model 和 class的区别
- 创建model
export const playMode = {
sequence: 0,
loop: 1,
random: 2
}
在外部使用先引入 import {playMode} from 'common/js/config'
再调用 mode: playMode.sequence
- 创建class
export default class Singer {
constructor({id, name}) {
this.id = id
this.name = name
this.avatar = `https://y.gtimg.cn/music/photo_new/T001R300x300M000${id}.jpg?max_age=2592000`
}
}
class在外部调用时,需要new一个对象 map.hot.items.push(new Singer({
name: item.Fsinger_name,
id: item.Fsinger_mid
}))
-
事件派发
this.$emit('select', item, index)
-
index : index ,前后一致,可以简写为index,如下面的方法
selectItem(item, index) {
this.selectPlay({
list: this.songs,
index
})
},
-
获取屏幕的宽度/高度 window.innerWidth
/window.innerHeight
window.innerWidth / window.innerHeight
-
ES6的写法
const {x, y, scale} = this._getPosAndScale()
_getPosAndScale()函数为
_getPosAndScale() {
const targetWidth = 40
const paddingLeft = 40
const paddingBottom = 30
const paddingTop = 80
const width = window.innerWidth * 0.8
const scale = targetWidth / width
const x = -(window.innerWidth / 2 - paddingLeft)
const y = window.innerHeight - paddingTop - width / 2 - paddingBottom
return {
x,
y,
scale
}
}
-
Vue 过渡动画transition
,可以利用钩子实现一些特殊动画.
动画和过渡的区别 ?
动画:可以不需要触发就可以执行
过渡:需要人为触发
可以学习vue-music
音乐内核动画
https://cn.vuejs.org/v2/api/#transition
-
create-keyframe-animation 获取dom的fame,用于实现移动动画,利用Vue.js 之 transition的钩子,可以实现各种复杂的动画.
-
x | 0 代表向下取整
const interval = interval | 0 //代表向下取整
-
获取拖动等手势 touchstart, touchmove ,touchend
实现方法
created() {
this.touch = {}
},
methods: {
progressTouchStart(e) {
this.touch.initiated = true
// e.touches[0] 表示第 0 个手指的位置
this.touch.startX = e.touches[0].pageX
this.touch.left = this.$refs.progress.clientWidth
},
progressTouchMove(e) {
if (!this.touch.initiated) {
return
}
const deltaX = e.touches[0].pageX - this.touch.startX
const offsetWidth = Math.min(this.$refs.progressBar.clientWidth - progressBtnWidth, Math.max(0, this.touch.left + deltaX))
this._offset(offsetWidth)
},
progressTouchEnd() {
this.touch.initiated = false
this._triggerPercent()
},
_triggerPercent() {
const barWidth = this.$refs.progressBar.clientWidth - progressBtnWidth
const percent = this.$refs.progress.clientWidth / barWidth
this.$emit('percentChange', percent)
},
-
通过点击事件,获取位置