vue使用过程踩坑【持续更新】

v-show 如何根据一个list是否为空控制显隐

示例代码如下:

<xxxtemp v-show="pictableData.data!=''"></xxxtemp>

<script>

export default {

    data() {

        return {

            pictableData: {

                ...

                data: [],

            }

        }

    }

}

</script>


常量如何根据环境变量自动切换赋值

const debug_tools = {

xxx: xx,

xxxx: xx

}

...

const TOOLIDS = DEBUG ? debug_tools : release_tools;


如何实现table的动态数据驱动

需求是table不确定有多少列,希望可以动态适配,一般的文本表格写法很简单(element-ui):

<el-table :data="tableData">

    <el-table-column v-for="(col,key) in cols" :key="key" :prop="col.prop" :label="col.label"></el-table-column>

</el-table>

<script>

export default {

    data() {

        return {

            tableData: [{}],

            cols: [{prop: 'xx', label: '列1'},...]

        }

    }

}

</script>

现在有个需求,cols中图片列的渲染希望用图片组件展示缩略图,当列都固定的时候自然可以直接定制:

<el-table-column prop="xxx" label="列1"></el-table-column>

...

<el-table-column prop="img" label="图片">

    <template scope="scope"><img src="scope.row.url" @click="open(scope.row)"></template>

</el-table-column>

但如果图片这一列前面不确定有多少列就麻烦了,曾经尝试在template层使用v-if v-else 判定当前单元格是否是图片,然后去渲染图片标签,但发现总是提示else和if没有配对出现,导致该方案流产且渲染效率会下降很多。

另一种方法是依赖vue的rander进行动态渲染,但网上表格中用rander的示例,都是依赖iview组件中的i-table,而本项目使用的是element-ui,而后者是没有在表格中封装支持rander的,网上有人指导了如何向iview一样封装该能力,但这样的成本不如替换iview组件:https://juejin.im/post/5a2f73a3f265da432718320c

iview的用法:

cols: [..., {

            prop: 'xxx',

            label: 'xxxxxx',

            rander: (h,params) => {

                return h('img', {

                    domProps: {

                        'src': this.tableData.data[params].path,

                        'alt': ''

                    }

                }

            }

        }]

最终思考,依然不是table的完全动态渲染,因为这种写法是从cols层写死了处理,既然怎么都不能完全动态适配,那本着最小修改的策略,用了最偷懒的一种写法:

<el-table-column v-for="(col,key) in cols.slice(0,-1)" :key="key" :prop="col.prop" :label="col.label"></el-table-column>

<el-table-column prop="img" label="图片">

    <template scope="scope"><img src="scope.row.url" @click="open(scope.row)"></template>

</el-table-column>

scope和slot-scope

像上一个问题中的代码一样,一直习惯使用scope,而上面代码在编译过程中就会收到一个warning:

scope warning

很明显,在vue2.5版本后,官方改了这个接口的名称(不稳定的工具就是这么随意),这里只要把scope替换成slot-scope就可以消除这个警告了。

VUE mounted 与 updated的执行顺序

最近开发vue界面遇到这样一种报错:Error in updated hook:"TypeError:undefined is not an object(evaluating 'this.$refs.child.doSomething')"

因为我们在父组件中通过cgi返回数据来动态加载不同的子组件:

<component :is="item"  ...   ref="child"></component>

mounted(){ cgi请求,回填data数据,判定返回结果,动态改变item组件 }

updated(){ this.$refs.child.doSomething(){} }

通过埋点日志我们发现对我们的当前使用场景,执行顺序是:mounted-》updated-》mounted-》updated,写到这里楼主已经在代码中发现问题所在了。之前楼主在mounted中进入后直接cgi请求获取数据,然后更新data数据(会触发updated)-但是item的判定也紧跟着更新数据几乎部分先后,因此执行到updated时组件已经初始化完,因此没遇到过问题。但是为了给cgi添加一个请求日期参数,楼主在cgi请求前对data中的日期字段做了取本地时间的动作,导致数据更新从而在cgi前触发了updated,cgi又返回比较慢,就导致item还没有确认要加载哪个组件,从而找不到doSomething。

优化:cgi使用的日期字段先用代码块区域内的临时变量,在cgi请求到数据成功返回后,回填cgi返回数据到data中时同步回填日期字段。理论上在数据回填前做item判定,但是目前看性能还好,暂不调整。

注:这里验证了vue生命周期图,updated在data被更新的任何时候立即执行,不管mounted是否完成。


el-dialog不居中问题

element-ui示例中的dialog弹出都是默认居中的,但在实际项目中使用时却发现向左偏了很多,未居中。仔细分析后发现,相比较例子,只是因为觉得默认弹出的dialog太宽,单独设置了width限制在了一个较小的宽度,一旦去掉这个设置就居中。

通过chrome调试css才发现是css作用域的问题,两种改法:不论哪种为了避免影响其他弹框,现在需要的弹框外添加一层<div>

1)如果样式放在<style scope>中,那么补充如下样式:

.div-dialog >>> .el-dialog {

    width:500px;

}

2)如果样式放在<style>中,那么补充如下样式:

.div-dialog .el-dialog {

    width:500px;

}

如何去掉VUE Router的锚点

默认情况下访问url,会发现在域名后面默认带上了 #,例如:http://xxx.xx.xxx/#/

一般场景应用没什么问题,但是如果你想在用户通过子页面url直接访问页面时(可能因为无登录态跳转登录后再回来),此时通过window.location.href来记录登录跳转前的url时,#号后面的部分都被截断了,因此这种场景目前需要去掉锚点。方法如下:

在 router-》index.js 中,添加made:'history'

去除锚点

el-tag绑定click事件无效问题

这里的问题是按照原来的习惯添加@click="xxx"时,发现怎么点击都无效,这个问题在官方的FAQ中已经说明:

https://github.com/ElemeFE/element/blob/dev/FAQ.md


click无效问题解决

同时可以修改下鼠标样式:http://www.w3school.com.cn/tiy/t.asp?f=csse_cursor, 比如手型cursor: pointer

vue week-range-picker实现

网上看起来靠谱的几个探索:

(1)掘金,但git仓库已删除:https://juejin.im/post/5c948acae51d4572d1055380

(2)CSDN,修改了底层源码,猥琐实现:https://blog.csdn.net/qq_39019765/article/details/103805773 ,不过代码补全,其中第几周计算的代码可以参考:https://blog.csdn.net/qq_34815027/article/details/78575261

(3)羡慕antdesign+react:https://ant.design/components/date-picker-cn/ 超简单的实现

最终,使用了两个week组件 + 自己写联动校验实现基本需求,不完美

vue el-date-picker 两个week完成周range选择能力时,第二个picker的样式异常且会影响其他pikcer

追踪样式发现,前端默认添加了系统样式

前端代码实现:

问题解决:把两个el-date-picker组件放到一个div中控制v-if,记得设置div display: inline

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

推荐阅读更多精彩内容