vue坑之宝库(持续更新)

  1. 使用fastclick 直接外部引入初始化,在手机模式下会报错Cannot read property 'style' of null;还是要npm下载后再import
npm install fastclick --save-dev
<!--main.js-->
import FastClick from 'fastclick'
FastClick.attach(document.body);

fastclick.js移动端WEB开发,click,touch,tap事件浅析

  1. created:在实例创建完成后执行的钩子
    mounted:编译好的HTML挂载到页面完成后执行的事件钩子
    它们的共同点是仅在Vue初始化时执行一次。
  2. Vue中可以直接调用JS的方法。但如果要调用 Vue中的 methods 中定义的方法就会绕一点,需要使用 this.$options.methods.MethodName();
  3. css里面的背景图片就会转成base64,html中的img图片就没转
  4. vue props传Array/Object类型值,子组件报错解决办法
  default:function(){
        return [];//或者是return {}
    }

  1. vue awesome swiper异步加载数据出现的bug问题
    加载数据之后再把轮播show出来

  2. 解决vue-cli项目无法用本机IP访问的问题
    ip改为0.0.0.0就能用自己ip访问了


vue中父组件传值给子组件,父组件值改变,子组件不能重新渲染
https://blog.csdn.net/qq_39692513/article/details/80791458

Vue父组件向子组件传递一个动态的值,子组件如何保持实时更新实时更新?
https://blog.csdn.net/zhouweixue_vivi/article/details/78550738
没用
    watch: {
            broadcastData: {    
                handler(newValue, oldValue) {      
                    for(let i = 0; i < newValue.length; i++) {        
                        if(oldValue[i] != newValue[i]) {          
                            console.log(newValue)        
                        }      
                    }    
                },
            deep: true  
            }
        },


Vue 父组件ajax异步更新数据,子组件props获取不到
https://blog.csdn.net/d295968572/article/details/80810349
用长度来判断组件是否显示
暂时先用这个方法,再来研究

再就是vue父组件点击触发子组件事件(https://blog.csdn.net/xiaozhuyirena/article/details/75126177)

通过  ref="child" this.$refs.child.upDate(data) 将数据传过去再加载子组件列表
感觉这个更方便额 不用props 父组件都不用再加个变量了

  1. 点击按钮路由跳转,有时出现Loading chunk 6 failed. 再点一下才跳转
    据说是运营商的劫持问题

  2. 在Vue中详细介绍$attrs属性
    主要是要解决多层组件的传值,感觉可以就用vuex呗

  3. this.router和this.route的区别

1. this.$router:

   表示全局路由器对象,项目中通过router路由参数注入路由之后,在任何一个页面都可以通过此方法获取到路由器对象,并调用其push(), go()等方法;

2. this.$route:

   表示当前正在用于跳转的路由器对象,可以调用其name、path、query、params等方法;

  1. 同一个component两个页面切换时并不会触发vue的created
我创建和编辑的页面使用的是同一个component,  
默认情况下当这两个页面切换时并不会触发vue的created或者mounted钩子,  
官方说你可以通过watch $route的变化来做处理,但其实说真的还是蛮麻烦的。  
后来发现其实可以简单的在 router-view上加上一个唯一的key,
来保证路由切换时都会重新渲染触发钩子了。这样简单的多了。

<router-view :key="key"></router-view>

computed: {
   key() {
       return this.$route.name !== undefined? this.$route.name + +new Date(): this.$route + +new Date()
   }
}

作者:花裤衩
链接:https://juejin.im/post/59097cd7a22b9d0065fb61d2
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  1. 组件报错 did you register the component correctly?...
不是啥不能用大写,就是输入组件名turnplateEntry后直接按table生成标签的时候都变成小写了turnplateentry,,蛋疼
  1. 过渡效果
<transition name="fade"></transition>

包住要过渡效果的代码或是组件

在common.css里面加上样式,所有地方都能用
.fade-enter-active,
.fade-leave-active {
   transition: opacity .5s;
}

.fade-enter,
.fade-leave-to {
   opacity: 0;
}

  1. 多个click事件 @click="a();b()",不能写多个@click
  2. 公共方法
Vue.prototype.aaa = function(){
    
};

可以用一个commonjs来放,然后统一挂载
//公共方法,调用方法,this.$comjs.xxx
import comJs from '@/utils/common'
Vue.prototype.$comjs = comJs;

19.监听store中的数据变化

vuex中的state在组件中如何监听?

用computed计算属性与watch

computed: {
   getGameNo() {
       return this.$store.getters.popLogin.gameNo
   }
},
watch: {
   getGameNo(val) {
       this.myGameNo = val;
   }
},

  1. this.$route.query.token 会获取到url上所有的token,两个的话就会以逗号分隔token1,token2;导致在请求的时候,传入的token参数,会变成
token[0]: 35385ac93a8d4fadbe5e671d0a2dcf6d
token[1]: 35385ac93a8d4fadbe5e671d0a2dcf6d

导致接口返回出错;

http.params('token')则获取的是第一个token;
出现两个token的原因是qq等第三方登录后,返回的链接会在后面加上token,再在这个页面用第三方登录的话就又在后面加上了token
解决办法:第三方登录时传入的url过滤掉token

  1. 组件里面有请求,如果v-if写在组件内,则组件没显示也会请求;v-if写在父级内,则只有组价显示的时候再请求,也就是v-if写在组件内,组件未显示也会加载,并且每次组件隐藏后的显示都会触发created等
  2. linux 区分大小写 ,import的时候要注意大小写
  3. 事件修饰符
.stop
.prevent
.capture
.self
.once
.passive

<!-- 只当在 event.target 是当前元素自身时触发处理函数 -->
<!-- 即事件不是从内部元素触发的 -->
<div v-on:click.self="doThat">...</div>

使用修饰符时,顺序很重要;相应的代码会以同样的顺序产生。因此,用 v-on:click.prevent.self 会阻止所有的点击,而 v-on:click.self.prevent 只会阻止对元素自身的点击。

  1. 动态设置元素高度,用:style,有计算的话,不能写在data里面,要写在computed
<div class="progress-progress" :style="{width: progress}"></div>


<div class="levelNow" :style="levelNowStyle"></div>

data() {
    return {
        showLevel: true,
        level: 9,
        progress:'50%'
        
    }
},
computed: {
    levelNowStyle() {
        return {
            'height': this.level + .9 - 1 + 'rem'
        }
    }
},

25.js加载本地图片再设置到img上,为了在获取不到用户图片的时候显示本地的默认图片
Vue.js中的图片引用路径

方法一
import defaultAvatar from '@/assets/images/defaultAvatar.png'
data() {
    return {
        defaultAvatar:defaultAvatar

    }
}
<div class="u-avatar"><img :src="defaultAvatar"  alt="美美的头像" /></div>
或是加判断
<div class="u-avatar"><img :src="vipInfo.headImageUrl || defaultAvatar"  alt="美美的头像" /></div>

有没有更简便的方法?

方法二
放到static里面引入,assets里面的会被构建,static里面的则是原封不动放过去
data里面 imgUrl : '../../static/logo.png'
<img :src="imgUrl" />
或是加判断
<div class="u-avatar"><img :src="vipInfo.headImageUrl || '../../../static/img/defaultAvatar.png'"  alt="美美的头像" /></div>
  1. vue 插件与组件的区别。插件还要用vue.use来注册

简单来说,插件就是指对Vue的功能的增强或补充。
比如说,让你在每个单页面的组件里,都可以调用某个方法,或者共享使用某个变量,或者在某个方法之前执行一段代码等
你也可以写一个插件,在Vue原型上扩展方法,要实现这个需求绝对没法写成组件。

如我要写一个每个页面都可能出现的弹窗,使用组件还是插件。
现在是组件,要在app.vue中加上login这个标签,要不就用插件的方式试试,再理解,插件也是要加上标签呀
插件通常会为 Vue 添加全局功能。 官网有这句话

  1. Vue style里面使用@import引入外部css, 作用域是全局的解决方案,未测试
  2. 在vue文件style中引入less不能用@符号作为路径 要用../
<style scoped lang="less">
@import "@/assets/css/common.less"; 这样不行 @的定义难道只在js和tem中有效?
@import "../assets/css/common.less";这样可以

  1. vux
需要npm install vux-loader --save-dev
npm install vux --save

再将build/webpack.base.conf.js
//将module.exports = {
改为
const originalConfig = {

底部加上
const vuxLoader = require('vux-loader')
const webpackConfig = originalConfig // 原来的 module.exports 代码赋值给变量 webpackConfig

module.exports = vuxLoader.merge(webpackConfig, {
  plugins: ['vux-ui']
})
开局还真是麻烦呀,不然各种报错

  1. store.dispatch的异步问题
为了保证在设置store的数据后再执行其他操作
store.dispatch('setToken', -1).then(()=>{
    $comjs.delTokenReload()
})

  1. 引入static/img里的图片 路径用../../等相对路径导致打包后路径错误,解决办法为直接用 /static/img --不行啊 混蛋,还是先用线上链接顶上吧,反正只有一个

  2. 另外发现 如果用户开始是试玩用户,点击微信登录后(用户头像已显示),马上将微信进程关掉,再进去也还是试玩账号,微信登录后过3s后再关闭则不会有问题,以上问题出现在ios的微信上,安卓的没问题,现在原因未知,可能和微信自身机制有关系,同样操作在qq上用qq登录没问题
    在微信上 感觉设置cookie有延迟,点击微信登录,跳转头像显示出来后,再关掉微信的进程,再进去还是临时账号,感觉是cookie还没设置好

  3. vue风格指南

永远不要把 v-if 和 v-for 同时用在同一个元素上。外面加一层写v-if
总是用 key 配合 v-for。

  1. 在单文件组件中没有内容的组件应该是自闭合的。
<!-- bad -->
<my-component></my-component>

<!-- good -->
<my-component />

  1. 组件选项应该有统一的顺序。
export default {
  name: '',

  mixins: [],

  components: {},

  props: {},

  data() {},

  computed: {},

  watch: {},

  created() {},

  mounted() {},

  destroyed() {},

  methods: {}
};

  1. 再次理解一下vuex,如token初始化只有在页面加载的时候一次,以后如果只是路由跳转就不会,一开始想的是万一token在某个组件上有更新再通过url传给下个组件,那下个组件的token还是取得老的,所以想把getters方法里面的token改为initToken(),那这样state.token就没用了呀,现在想到,通过url穿入的token只有可能是新的页面跳转,如果是我内部的路由跳转,token就直接用actions了,不会走url了。
  2. 在外部css中引入背景图片,一直报错(暂未解决)现在是把公共样式里设置背景图的代码移到了app.vue里面
    生成的css文件中background url()图片路径问题 这个下面倒是有个很多赞的答案,但我随便试了一下没成功,改了build/utils.js之后,在css里的图片该怎么引入呢
    Vue项目中设置背景图片像这种通过js变量再去设置背景图的办法很麻烦呀
  3. 向组件内添加html元素 用 <slot></slot>
  4. 路由跳转 this.$router.push(location) <router-link :to=""></router-link>
    router-link API 参考
  5. 一个困扰了我十分钟的问题,上面两种路由跳转都不跳转,很是诡异,排查了半天,终于是在main.js中发现
router.beforeEach((to, from, next) => {


})
我以为为空的话,就什么都不改变,结果是也不跳转了

  1. vue字体文件如何取消每次构建后的版本号变化,(可能文件不变,版本号没变,需测试),再就是可以直接丢到static中
  2. img标签加载的图片不知为何会过几秒就重新加载一次,页面无反应,但资源一直在请求 只有turnplate有;
  3. 在this.$store.dispatch回调里面执行之后的操作,防止异步的问题
this.$store.dispatch('setUserInfo','45456').then(()=>{
    
})

  1. 动态import;头部的import XXX from "xxx"应该是同步的
//设置用户信息后需要重置下ajax请求头的信息
import('@/utils/http').then(res => {
    res.resetHeaders()
})

  1. 在store里面引入 其他js文件,那个文件又有用到store,那这个就store就undefined了;可以用上面的动态import
  2. 记得清楚定时器
beforeDestroy() {
    //清除跑马灯的定时器
    clearInterval(this.interval_marquee)
}

  1. 滚动行为
    使用前端路由,当切换到新路由时,想要页面滚到顶部,或者是保持原先的滚动位置,就像重新加载页面那样。 vue-router 能做到,而且更好,它让你可以自定义路由切换时页面如何滚动。
  2. 引入字体报警告 Failed to decode downloaded font 是因为没有写format
@font-face {
    font-family: 'roman';
    src: url('~assets/fonts/roman.ttf') format('TTF');
    //format写TTF不行滴,就没有生效 要写truetype
    src: url('~assets/fonts/roman.ttf') format('truetype');
    但是写了truetype后 又开始报警告了
}
另外 woff 是 format('woff')
eot是format('embedded-opentype')
svg是format('svg')
  1. css里面图片的引入问题,改过了 build/utils.js=> lessResourceLoader忘记来里面加publicPath: '../../'了,

50. 注意区分文件的大小写,因为我们是在服务器构建,是严格区分大小写的

  1. vue 计数 跳动 插件 decimal几位小数就设置这个
  2. 使用better-scroll后滚动区域的文字就不能长按复制了
加上这个就好了 里面的div、p、span、i标签是我自己加的,不确定是否有什么问题
preventDefaultException: {
    tagName: /^(INPUT|TEXTAREA|BUTTON|SELECT|DIV|P|SPAN|I)$/
}

scroll组件内的文字在浏览器中无法选中复制
使用preventDefaultException无效

  1. 避免内存泄漏
    在 Windows 上则是 Shift+Esc 快捷键打开 Chrome 任务管理器
  2. vue 动态替换路由(地址栏)参数

import merge from 'webpack-merge';
 
修改原有参数        
this.$router.push({
    query:merge(this.$route.query,{'maxPrice':'630'})
})
 
新增一个参数:
this.$router.push({
    query:merge(this.$route.query,{'addParams':'我是新增的一个参数,哈哈哈哈'})
})
 
替换所有参数:
 this.$router.push({
    query:merge({},{'maxPrice':'630'})
})

  1. 在reset.less中的html,body,div...加了font-size或是font-family 会导致这些标签加载多次重置样式,导致继承于父级的样式字体大小会被重置;

  2. <template></template> 中用循环,不能有key

  3. axios全攻略

  4. style中引入图片或less要加上 ~;template中直接用 @

@import '~@/assets/less/var.less';

background: url("~@/assets/images/yuan@2x.png") no-repeat;

  1. 计算属性传参数
:data="closure(item, itemName, blablaParams)"

computed: {
 closure () {
   return function (a, b, c) {
        /** do something */
        return data
    }
 }
}

我估计,vue内部会把接受到闭包的参数,再调用apply 的时候带上去,只不过,从标准上来说,computed传参不太合规矩,所以文档内就没说这样和用方法没区别了吧,用不了computed的缓存

这样和用方法没区别了吧,用不了computed的缓存
有缓存的 我做过实验 你也可以尝试一下

  1. 计算属性是基于它们的响应式依赖进行缓存的。只在相关响应式依赖发生改变时它们才会重新求值
  2. 可以定义重复的路由,且先定义的有效
  3. chooseJob-popup 在组件名中驼峰和横杠不能混用
  4. vue获取元素宽、高、距离左边距离,右,上距离等还有XY坐标轴;this.refs['通过设置ref获取到的dom元素'].getBoundingClientRect(); //示例: 获取元素距离顶部的距离 this.refs.journalUpward.getBoundingClientRect().top
  5. vue路由传参方式,vue路由传参常用的三种方式
    路由传参数,不用?问号,通过path跳转
getDescribe(id) {
    // 直接调用$router.push 实现携带参数的跳转
    this.$router.push({
     path: `/describe/${id}`,
    }
 
}

对应路由配置如下:
{
     path: '/describe/:id',
     name: 'Describe',
     component: Describe
   }

接收参数
$route.params.id
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,287评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,346评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,277评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,132评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,147评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,106评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,019评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,862评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,301评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,521评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,682评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,405评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,996评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,651评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,803评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,674评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,563评论 2 352

推荐阅读更多精彩内容