1.使用 svg 组件进行图标引用
以前图片一般用 img 来实现,后来因为请求资源太多进行优化,使用雪碧图,但雪碧图修改起来不方便,
就使用 font 库,font 的资源图标有限,找图难受
使用阿里开源库 iconfont,各种小图标,自定义图标,
使用 symbol 姿势
1.1 创建 icon-component 组件
1 2 3 4 5
| <template> <svg :class="svgClass" aria-hidden="true"> <use :xlink:href="iconName"></use> </svg> </template>
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| <script> export default { name: 'svg-icon', props: { iconClass: { type: String, required: true }, className: { type: String } }, computed: { iconName() { return `#icon-${this.iconClass}` }, svgClass() { if (this.className) { return 'svg-icon ' + this.className } else { return 'svg-icon' } } } } </script>
<style scoped> .svg-icon { width: 1em; height: 1em; vertical-align: -0.15em; fill: currentColor; overflow: hidden; } </style>
|
1.2 使用 svg-sprite-loader 将 svg 打包成 svg-sprite
默认的 vue-cli 对 svg 有处理,为了防止冲突,采用 webpack 的 exclude,include 来处理,代码如下:
webpack.base.config.js 中
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| { test: /\.svg$/, loader: 'svg-sprite-loader', include:[resolve('src/icons')], options: { symbolId: 'icon-[name]' } }, { test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, loader: 'url-loader', exclude:[resolve('src/icons')], options: { limit: 10000, name: utils.assetsPath('img/[name].[hash:7].[ext]') } },
|
1.3 建立@/src/icons/index.js 自动导入图标
新建 icons 文件夹下面 svg 文件夹拿来放 svg 格式的图片 index.js 代码如下
1 2 3 4 5 6 7 8 9
| import Vue from 'vue' import SvgIcon from '@/components/SvgIcon'
Vue.component('svg-icon', SvgIcon)
const requireAll = requireContext => requireContext.keys().map(requireContext) const req = require.context('./svg', false, /\.svg$/) requireAll(req)
|
1.4 在 main.js 中引入 icons
###1.5 在组件中直接使用组件调用
1
| <svg-icon icon-class="password" />
|
2.通过参数 ID 修改 Url 复用同一个页面不进行数据刷新
同一个组件中,只是传递的 url 值如 Id 不相同,希望每次都能够请求后台获取数据
最开始是放在 created 中,发现根本不行
通过 watch 监听路由 from,to 筛选当前的路由进行操作
1 2 3 4 5 6 7 8 9 10
| watch: { $route(to, from) { if (to.name === 'levelThree') { console.log(this.$route.query.device_id) this.deviceId = this.$route.query.device_id this.getDeviceInfo() } } },
|
3.vue 右键菜单栏
https://github.com/vuejs/awesome-vue#context-menu
https://github.com/xunleif2e/vue-context-menu
表单上传主要是利用 new FormData() 一个对象 然后使用 append 方法进行添加
1 2 3 4 5
| onchange(event){ let file = event.target.files[0] let formdata = new FormData() formdata.append('file',file) }
|
5.自定义弹出框样式
内部 scope 不生效 自定义一个 class 然后用全局的样式去覆盖
6.时间问题
标准日期:2017-09-19 或 2017-09-19 20:00:00
中国标准时间:Mon Oct 23 2017 17:20:13 GMT+0800 (中国标准时间)
时间戳:1508750413
毫秒数:1508750413000
注意:时间戳*1000 就是毫秒数
https://blog.csdn.net/it429/article/details/78341847
结合 elementUI 的 dateTime 使用
new Date(val)
new Date().setHours(0,0,0) 得到凌晨时间戳
new Date().setHours(23,59,59) 最后一秒时间戳
当前时间戳: 毫秒级别
new Date().getTime()
Date.now()
7.图片上传预览功能
思路: 先用 input[type=file]通过 onchange 事件来获取本地的图片,然后用 HTML5 的 File API 的 FileReader 图片本地转成 base64 格式的 url,把这个 url 赋值到用于预览的 src 就好了。
1 2
| <img :src="preViewImgUrl" width="160" height="120"/> <input class="image-input" id="inputFile" accept="image/jpeg,image/jpg,image/png" type="file" @change="changeImg($event)" />
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| changeImg(e) { var imageFile = e.target.files[0] console.log('imageFile===', imageFile) if (!e || !window.FileReader) return let reader = new FileReader() reader.readAsDataURL(imageFile) let _this = this reader.onloadend = function() { console.log('reader.onloadend======') _this.preViewImgUrl = this.result } e.srcElement.value = '' }
|
8.element-ui 按需加载的时候 v-loading 不起作用
vue.esm.js?efeb:591 [Vue warn]: Failed to resolve directive: loading
10.父组件异步获取的值传给子组件 采用 v-if 解决 mounted created 中可以拿到
vue 父子组件数据同步
11.获取本地 ip
location.hostname
location.port
window.location.href = url // 直接跳转链接
12. 打包后 404 问题
1.整个 css404 修改配置文件的 config/index.js build: {assetsPublicPath: ‘./‘}
2.图片的路径 404 正常情况下引入图片会 background: url(assets/login-bg.jpg) no-repeat center center;
需要在 build/utils.js 中添加
1 2 3 4 5 6 7 8 9
| if (options.extract) { return ExtractTextPlugin.extract({ use: loaders, fallback: 'vue-style-loader', publicPath: '../../' }) } else { return ['vue-style-loader'].concat(loaders) }
|
3.去掉打包的 sourceMap 文件
在 config/index.js 中设置 build 下的 productionSourceMap: false
13. 跨域问题
自定义请求的时候会产生 options 操作 需要服务器允许自定义请求头的自定义字段 后端需要在 options 请求头中 返回自定义的相同字段
14.vue 自定义指令的封装
imgerror.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| export default Vue => { Vue.directive('src-err', { inserted(el, data) { if (data.value) { el.src = 'data:img/jpg;base64,' + data.value } else { console.log('into', data.value === '') el.src = require('@/assets/images/img404.png') } }, updated(el, binding, vnode, oldVnode) { console.log('into src-error updated') }, componentUpdated(el, data, vnode, oldVnode) { console.log('into src-error componentUpdated') if (data.value) { el.src = 'data:img/jpg;base64,' + data.value } else { console.log('into', data.value === '') el.src = require('@/assets/images/img404.png') } } }) }
|
main.js 中引入
import directives from ‘./directive/imgerror.js’
Vue.use(directives)