【区分】
preload 是告诉浏览器页面必定需要的资源,浏览器一定会加载这些资源
prefetch 是告诉浏览器页面可能需要的资源,浏览器不一定会加载这些资源
本文不仅限于vux组件,包括项目中遇到的一些问题记录
本文不仅限于vux组件,包括项目中遇到的一些问题记录
原先写法:1
2
3
4
5AlertModule.show({
title: '提示',
content: '请输入手机号码',
maskTransition: '' // 原生的 maskTransition 动画慢一拍,设置为空取消动画
})
每次写都要加maskTransition: '' // 原生的 maskTransition 动画慢一拍,设置为空取消动画
,为了简写,封装一个函数,预设设置。
src/plugins/Alert.js:1
2
3
4
5
6
7
8
9
10import { AlertModule } from 'vux'
export default function(tip, payload = {}) {
AlertModule.show({
title: '提示',
...payload,
content: tip,
maskTransition: '' // 原生的 maskTransition 动画慢一拍,设置为空取消动画
})
}
并将yxAlert写到 Vue.prototype.$yxAlert 上
src/plugins/index.js:1
2
3
4
5
6import yxAlert from './Alert'
export default {
install: (Vue, options) => {
Vue.prototype.$yxAlert = yxAlert
}
}
同理,src/plugins/Alert.js:
1 | export function yxToast(tip, position = 'bottom') { |
引用:
1 | this.$yxToast('请输入您的手机号码') |
vux
自带防抖函数,简单包装在工具函数js里src/utils
1 | import { dateFormat, debounce as vuxDebounce } from 'vux' |
使用方法:1
2
3
4// 上拉加载
onPullingUp: throttle(function() {
this.SearchOranizations()
}, 2000),
由于vux没有element-ui一套完整的验证规则,可采用vee-validate插件
vue-awesome-swiper 当你使用了 loop 模式,尽量用 v-if 来控制 swiper 组件的渲染,并且,swiper 对 图片懒加载不友好。
1 | <swiper :options="swiperOption" ref="swiperOption" v-if="value.length > 0"> |
采用插件sideout.
请查看 Browser.js
本项目使用 better-scroll,封装从 cube-ui的 Scroll 组件,api可查看文档
bs有个问题,在手机uc浏览器,手机safria浏览器,底部栏会遮挡底部内容1
2
3
4
5
6
7
8
9
10
11
12
13_calculateMinHeight() {
if (this.$refs.listWrapper) {
this.$refs.listWrapper.style.minHeight = this.pullDownRefresh || this.pullUpLoad ? `${getRect(this.$refs.wrapper).height + 1}px` : 0
}
/* 给 UC,safira浏览器增加 padding-bottom,防止底部栏遮挡内容 */
var _navigator = typeof navigator !== 'undefined' ? navigator : {}
var u = _navigator.userAgent || {}
var isUC = u.indexOf('UC') > -1 || u.indexOf(' UBrowser') > -1
// var Safari = u.indexOf('Safari') > -1
if (isUC) {
this.$refs.listWrapper.style.paddingBottom = '50px'
}
},
由于vux没有图片上传组件,故采用ube-ui
的upload组件,并简单封装一下。
1 | <yx-upload |
1 | <a href="www.baidu.com"></a> |
点击A标签本身,并不会触发跳转到指定链接的事件,就是说,我们平时都是点击的A标签中的文字了。 所以要想用JS模拟点击A标签事件,就得先往A标签中的文字添加能被JS捕获的元素,然后再用JS模拟点击该元素即可。
打印$(“a”)[0],得到的是http://www.baidu.com,但实际上$(“a”)[0]是一个object对象,或许说是DOM对象更贴切一些。
1 | document.getElementById("abc ").click(); |
1 | $("#abc ")[0].click(); |
removeEventListener() 方法用于移除由 addEventListener() 方法添加的事件句柄。
注意: 如果要移除事件句柄,addEventListener() 的执行函数必须使用外部函数
匿名函数,类似 “document.removeEventListener(“event”, function(){ myScript });” 该事件是无法移除的。
在每个组件里加载一个设置文件,而无需每次都将其显式导入,是一个常见的需求。比如为所有组件全局使用 scss 变量。为了达成此目的:
1 | npm install sass-resources-loader --save-dev |
(如果你使用了 vuejs-templates/webpack,请如下修改 build/utils.js:)
1 | scss: generateLoaders('sass').concat( |
如果路径是绝对路径,会原样保留。
如果路径以 . 开头,将会被看作相对的模块依赖,并按照你的本地文件系统上的目录结构进行解析。
如果路径以 ~ 开头,其后的部分将会被看作模块依赖。这意味着你可以用该特性来引用一个 node 依赖中的资源:
1 | <img src="~some-npm-package/foo.png"> |
(13.7.0+) 如果路径以 @
开头,也会被看作模块依赖。如果你的 webpack
配置中给 @
配置了 alias
,这就很有用了。所有 vue-cli
创建的项目都默认配置了将 @
指向 /src
。
qrcodejs
没有采用模块化包装,需要自行封装1 封装:1
2
3
4
5
6
7
8
9
10
11(function(root, factory) {
if (typeof define === "function" && define) {
define(factory);
} else if (typeof exports === "object") {
//Node, CommonJS之类的
module.exports = factory();
} else {
//浏览器全局变量(root 即 window)
root.QRCode = factory();
}
})(this, function() {})
1 | QRCode = function(el, vOption, fn) { // line:1472 |
使用方法:
1 | _self.qrcode=div2canvas.qrcode("#shop-item-share__qrcode",{ |
html2canvas
注意有些css会影响正常生成图片,比如 flex
,css3 transform
此外,html2canvas
需要promise
的支持,建议用 babel-pollyfill 或者 es6-promise
html2canvas文字含中文括号或者其他特殊字符的时候,生成图片时会跑到下面,与下面文字重叠,通过给字符加上span
标签解决
1 | function wrap(str){ |
完整代码如下:
1 | define('module/div2canvas', function(require, exports, module){ |