依赖版本号
"dependencies": {
"axios": "^0.18.0",
"fastclick": "^1.0.6",
"jsonp": "^0.2.1",
"vue": "^2.5.2",
"vue-awesome-swiper": "^3.1.3",
"vue-router": "^3.0.1"
},
问题总汇
1. 开发前的准备工作
1) vue-cli脚手架安装
vue init webpack my-project
2) 配置meta标签
<meta name="viewport" content="width=device-width,initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no">
3) 解决移动端300ms延迟
//main.js
import FastClick from 'fastclick'
FastClick.attach(document.body)
4) 解决抓取接口的跨域问题
(没用原视频讲的jsonp方法)
参考文章:
https://blog.csdn.net/u012369...
https://blog.csdn.net/fabulou...
2. props中 数组和对象 的写法
props: {
items: {
type: Array,
default () {
return []
}
}
}
3. <keep-alive>缓存路由页面
<keep-alive>
<router-view/>
</keep-alive>
了解更多<keep-alive>: https://segmentfault.com/a/11...
4. promise封装
new Promise((resolve, reject) => {
jsonp(url, option, (err, data) => {
if (!err) {
console.log(data);
reslove(data)
} else {
console.error(err)
reject(reject)
}
})
})
5. get请求的url拼接
url += (url.indexOf('?') < 0 ? '?' : '&') + param(data)
function param (data) {
let url = ''
for (let i in data) {
let value = data[i] !== undefined ? data[i] : ''
url += `&${i}=${encodeURIComponent(value)}`
}
return url ? url.substring(1) : ''
}
6. encodeURI() 与 encodeURIComponent()区别
encodeURI()是对整个URL编码的函数,对特殊含义的符号"; / ? : @ & = + $ , #"不进行编码,解码函数decodeURI()。
encodeURIComponent()能编码"; / ? : @ & = + $ , #"这些特殊字符,解码函数decodeURIComponent()。
例:
encodeURIComponent('{ "ct": 24 }') // 结果: "%7B%20%22ct%22%3A%2024%20%7D"
encodeURI('{ "ct": 24 }') //结果:"%7B%20%22ct%22:%2024%20%7D"
参考文章: https://www.cnblogs.com/huzi0...
7. scoped 与 module区别
网上一搜一大堆内容,我用的module,就是每次写$style.className好头疼。。。
8. css样式:两行后省略
display: -webkit-box;
overflow: hidden;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
9. 箭头函数与普通函数中的this指向
见我提的问题:https://segmentfault.com/q/10...
参考文章:https://www.cnblogs.com/freel...
10. slice(),splice(),split()用法
slice:
返回为新数组,原数组没有变化
var arr= [1,2,3,4];
var sliceArr= arr.slice(1,2);
此时arr还是[1,2,3,4],sliceArr是[2]
splice:
返回被删除的项目,原数组发生变化
arrayObject.splice(index,howmany,item1,.....,itemX),
第一个参数是删除的index,第二个是数量,第三个和之后的是插入的内容,从第一个参数开始的位置插入。
var arr=[1,2,3,4,5,6];
arr.splice(1,2,7);
返回[2,3],arr是[1,7,4,5,6]
split:
把一个字符串分割成字符串数组
var str="1-2-3-4";
var spliteStr = str.split("-");
返回数组[1,2,3,4]
11. vue-awesome-swiper 设置swiperOption参数无效,自动轮播无效。
个人理解:
需要组件有高度时才能轮播,即需要先有元素渲染
参考文章:https://blog.csdn.net/m0_3788...
//在slider组件上加 v-if="items.length"功能可实现,其中items是轮播图数组数据。
<slider :swiperOption=options :items="bannerList" v-if="items.length"/>
鼠标翻页后,自动轮播又无效??
未解决
12. vue浏览器小图标不显示
将favicon.icon放在根目录下(与 index.html同级)
我用的vue-cli,需要配置webpack.dev.conf.js:
new HtmlWebpackPlugin({
filename: 'index.html',
template: 'index.html',
inject: true,
favicon: './favicon.ico'
})
参考文章:https://www.jianshu.com/p/877...
13.vue懒加载插件: vue-lazyload
14. $emit
实现功能: 点击基础组件的某个元素进行二级路由跳转
不在基础组件中做业务逻辑
//base.vue
<template>
<div>
<h2 @click="recommendMore">更多推荐</h2>
</div>
</template>
methods: {
recommendMore () {
this.$emit('recomMore')
}
}
//home.vue
<base @recomMore="recomMore"/>
methods: {
recomMore () {
this.$router.push({
path: '/recommend/recommendMore'
})
}
}
15. 二级子页面滚动完成后继续滚动一级页面?
未解决
16. 什么时候用vuex
如vuex文档所,它就像眼镜,自会知道什么时候需要它。
所要实现的功能:
点击一组列表,跳转到每个列表的详情页,
而详情的数据获取依赖于被点击的某个列表的id,
此时需要将id传到 路由跳转到的二级页面。
在click 每个item时,除了实现跳转功能,还要实现将数据传到跳转页面
clickItem(item) {
this.$router.push({
path: `/recommend/${item.content_id}`
})
//在这里调详情接口数据能获得到,但是传不到跳转页面 需vuex?嗯,需vuex!! 直接将所需参数传过去,在详情页调用详情接口。
this.setRecommend(item)
(这里卡了好长时间,一直在找数据传递的方法,没思考到要用vuex)
17. 重启项目npm run dev时,报错
Error parsing D:\project\myworkplace\vue-music\my-music\node_modules\_node-libs-browser@2.1.0@node-libs-browser\node_modules\crypto-browserify\package.json
打开报错文件目录下的package.json为空,上次打开还可以正常运行,不知道报错原因。
因为是调用的qq音乐的接口,估计跟接口发生了变动有关?
我的思路:
注释掉相关接口,重启 (无效)
删除node_modules,再重新安装一遍(代价太大,想了想然后放弃)
原因:
与原依赖对比,package.json不应该是空,应该是有内容的。怀疑是自己午休时不注意碰到按键删除了。。。。
将package.json内容恢复后项目正常运行。
crypto-browserify地址:https://github.com/crypto-bro...
18.刷新子组件页面时数据失效
未解决
19. 列表上拉时bg-layer随着向上移动。
未解决
20. vue jsonp接口返回200,但报错“Uncaught ReferenceError: jsonCallback is not defined” ,前端取不到数据。
原因:
jsonp自身增加了一个参数: callback=__jp1, 这个参数不是我想要的,与后台协议好的参数是: jsonCallback: jsonCallback
所以需要自定义callback的名和值,即设置option:
const option = {
param: 'jsonCallback', //名
prefix: 'jsonCallback' //值
}
但是,这样设置还不够,设置的值会自己在后边加数字,会出现jsonCallback0 jsonCallback1。。。等情况。
所以还需要最后一步,修改jsonp源码index.js如下代码:
// var id = opts.name || (prefix + (count++)); //源代码
var id = opts.name || prefix;//修改后代码,禁止参数自增
21. vue-router跳转问题
有一组id,当id= 2时跳转到mv页面,其他时候跳转到song页面。
我的问题: 虽然在点击调转时做了判断,链接也跳到了nv页面,但是渲染的却是song的页面
//router下的index.js
{
path: '/home',
name: 'Home',
component: Home,
children: [
{
path: ':id',
component: SongDetail
},
{
path: 'mv',
component: MvDetail
}]
}
//home.vue下的click点击跳转方法
click(item) {
if (item.id === 2) {
this.$router.push({
path: '/home/mv'
})
}
else {
this.$router.push({
path: `/home/${item.id}`
})
}
},
解决方法:将router index.js路由交换,将mv放上边,如下:
{
path: '/home',
name: 'Home',
component: Home,
children: [{
path: 'mv',
component: MvDetail
},
{
path: ':id',
component: SongDetail
}]
}
22. v-lazy默认图片怎么根据不同实际图片尺寸发生变化
未解决
23. vuex报错:"Error: [vuex] Expects string as the type, but found undefined."
actions写错:
//错误写法
import mutationTypes from './mutation-types'
export const clickPlayerItem = function ({ commit }, { playList, index }) {
commit(mutationTypes.SET_PLAYLIST, playList)
commit(mutationTypes.playIndex, index) //错误在这里,将SET_PLAYINDEX 写成了 playIndex,导致报错
}
//正确写法
export const clickPlayerItem = function ({ commit}, { playList, index }) {
commit(mutationTypes.SET_PLAYLIST, playList)
commit(mutationTypes.SET_PLAYINDEX, index)
}
24. [Vue warn]: Computed property "showBigPlayer" was assigned to but it has no setter
showBigPlayer 是从vuex中获取,改变时不能直接像如下代码这样改变:
back () {
this.showBigPlayer = false
}
应该通过mapMutations进行值的改变,正确代码如下:
back () {
this.setShowBigPlayer(false)
},
...mapMutations({
setShowBigPlayer: 'SET_SHOW_BINGPLAYER'
})
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。