vue-issues
vue nextTick
nextTick 解决要等 dom 后执行操作 比如对有 if 条件渲染的 dom 节点要进行处理
日期格式化之阿拉伯数字转中文
导入日期函数
import { date } from 'phpjs'
将阿拉伯数字转换为中文 高阶函数,过滤器,数组 星期几的数字作为数组索引取出对应的中文
// 星期{{day | date 'w' | week}}
filters: {
week: function (value) {
return ['日', '一', '二', '三', '四', '五', '六'][value]
}
}
将 vue data 对象转换为普通对象
const newObj = { ...vueObj }
v-for 中过滤、处理数据
- filter 在 vue 2 中移除了
- 直接在 methods 中使用
arr.sort()
等副作用方法,会引起更新,再次执行 v-for,形成死循环 - 可以使用 methods
- 使用 computed,注意用 map 方法拿副本去 sort javascript - vue.js filters in v-for - Stack Overflow
svg
javascript - Vue Cli 3 is not allowing me to process SVG's in Webpack - Stack Overflow
组件原子拆分、合成
- 独立可测试,单一职责,原子化,以便根据业务合成,而不是追求少创建文件。确保可维护,稳定
- 为何“只有一个改变的原因”如此重要呢?因为这样组件的修改就被隔离开来,变得可控了。
- 单一职责限制了组件的体积,也使其聚焦于一件事。这有利于编码,也方便了之后的修改、重用和测试。
- 职责拆分:数据、UI,命名 with *总结一下开闭原则就是:软件系统的核心逻辑都不应该轻易改变,否则会破坏系统的稳定性和增加测试成本。我们应当建立合适的抽象并统一接口,当业务需要扩展时,我们可以通过增加实体类来完成。 组件的划分 - 掘金[译] 更可靠的 React 组件:单一职责原则-云栖社区-阿里云前端早读课前端早读课
watch bug
- default 是组件不绑定 prop 的回退
- 数据有变化,watch 一定会触发
- 数据 ready 后渲染子组件,子组件中的 watch 不会触发,因为没为变化,如,两个并行请求,第一个请求完成时渲染子组件,当第二个请求更快完成时,会准备好数据,先于子组件渲染js
// watch 元素不一定变化,存在即需要执行 function ensureWatchVueData(key, callback) { if (this[key]) { callback() } else { this.$watch(key, value => { if (value) { callback() } }) } }
watch object array
- object deepjs
// 该回调将会在侦听开始之后被立即调用 d: { handler: function (val, oldVal) { /* ... */ }, // 这里 function 不要用箭头函数 deep: true }, // 或者 'a.d'() {}
- array 无法 watch ? 把数组转字符串存储,用的时候再解析为数组,需要不停来回转换? vue.js - vue watch 数组变化问题 - SegmentFault 思否
前端编译服务崩溃问题
升级 vue-cli 3 后,在修改 JS 文件,尤其是频繁保存时,服务极易崩溃,可以稳定重现 因为我大部分时间在编辑 vue 文件,感觉不明显,x 同事反映比较突出,严重影响开发效率 崩溃原因: sourcemap 生成、 文件 watch 等功能内存占用大,webpack 部分插件内存泄漏、高内存占用,触及 V8 默认回收上限 1400Mb 解决办法是提升上限,避免触及,需要注意如何正确地添加参数
错误方式(x 同事在 package.json 中添加的): $ vue-cli-service serve --max_old_space_size=4096
正确方式:
参数应该指定给 node:
node --max_old_space_size=4096 node_modules/@vue/cli-service/bin/vue-cli-service.js serve --open
yarn serve - JavaScript heap out of memory crash · Issue #1453 · vuejs/vue-cli
fix: increase Node memory limit to workaround webpack crash, fix #1453 · octref/vue-cli@bb98ef0
相关 Issue: Process out of memory - Webpack · Issue #1914 · webpack/webpack
编译慢问题
npm install [email protected]
# 或者
cd node_modules
git clone https://github.com/jantimon/html-webpack-plugin.git
git checkout feature/cache-file-timestamps
build performance · webpack/docs Wiki
vue-cli-service 如何本地配置某个依赖
neutrinojs/webpack-chain: A chaining API to generate and simplify the modification of Webpack configurations. webpack 的 stats 配置不能用,选了别的插件 stats config invalid ? · Issue #2652 · vuejs/vue-cli
解决 iOS 中 fixed 定位,输入时错位的问题
根据 focus 和 blur 的状态添加移除 fixfixed 类 把 position 改为 absolute 是普遍做法,当试了不行,干脆直接隐藏
.fixfixed .ui-header,
.fixfixed .ui-footer {
/*position: absolute;*/
display: none;
}
methods: {
inputFocus: function () {
var body = window.document.getElementsByTagName('body')[0]
body.className = 'fixfixed'
},
inputBlur: function () {
var body = window.document.getElementsByTagName('body')[0]
body.className = ''
}
}
v-for 循环绑定不生效
// not work
.item(v-for="key of answerKeys" :class="[ key === rightAnswer ? 'right' : 'wrong' ]")
// work
.item(v-for="key of answerKeys" :class="{ 'right': key === rightAnswer, 'wrong': key !== rightAnswer }")
异步引入
- script vue 插件
await Vue.loadScript(scripts[0])
const afterScripts = scripts.slice(1)
return Promise.all(afterScripts.map(url => Vue.loadScript(url)))
scripts.forEach(url => Vue.unloadScript(url))
- import 加 promise,取出?
Promise.all([
import(/* webpackChunkName: "docsearch" */ 'docsearch.js/dist/cdn/docsearch.min.js'),
import(/* webpackChunkName: "docsearch" */ 'docsearch.js/dist/cdn/docsearch.min.css')
]).then(([docsearch]) => {
html 中使用相对路径
html image src require not respecting webpack aliases? · Issue #193 · vuejs/vue-loader
动态图片引入
Using Dynamic Static Image URLS in Vue.js The quick answer, a partially defined path. :src="require(
@/assets/cards/${image}.jpg)"
Dependency Management | webpack
spa scroll
Automatic scroll restoration in Single Page Applications (SPA) — Childhood Cancer Data Lab
2.6 Vue.observable
有待改进
- router children 嵌套,不要全是一级,跳转传参可在 path:id 来配置
- 测试数据,可写成模块js
/** * 创建临时数据 */ const setpromise = data => { return new Promise((resolve, reject) => { resolve(data) }) }
scoped + 深度影响子组件样式
/deep/
组件切换数据问题 v-if 和 v-show
如果用v-show
的话,mounted
只执行一次,如果希望组件显示时执行,简单解决是改用v-if
,比较复杂的方法如下: vue.js - Trigger code on component v-show=true - Stack Overflow
大小写
html 属性为何用短杠,因大小写不敏感,大写也会转换成小写
prop 如何接受进行多种类型校验
validator: prop => typeof prop === 'number' || prop === null,
debug 模板
Vue.prototype.$log = console.log
{
{
$log(messaage)
}
}
{
{
;(function() {
debugger
})
}
}
mock
- vue cli3 在 devServer 中添加 before
- 添加自定义响应返回代码
- mockjs 增强 mock 能力,可选 Vue CLI 3 + webpack + Mockjs实现本地数据模拟 - 简书Mock Data | vue-element-adminjavascript - Node.js - SyntaxError: Unexpected token import - Stack OverflowMock 数据@babel/register · BabelUMI mock 开发中遇到的问题,已经处理的,在这里记录一下。给朋友们一个参考 · Issue #246 · umijs/umi30 道 Vue 面试题(涵盖入门到精通,自测 Vue 掌握程度) - 哔哩哔哩
Vue 3 迁移指南
v-model 支持多个
https://v3.cn.vuejs.org/guide/migration/v-model.html#_3-x-语法
其它
slot 分发内容,占位替换
动态组件:is
区分Vuex与props的使用边界 Vuex 业务组件,集中管理 props 公共组件,组件库
路由ID变了,但组件没变? 使用beforeRouteUpdate
在v-if/v-if-else/v-else中使用key 如果本不相同的元素被识别为相同,则会出现意料之外的副作用。
异步组件
import Foo from './Foo.vue'
// after
const Foo = () => import('./Foo.vue')