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

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

示例代码如下:


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

const debug_tools = {

xxx: xx,

xxxx: xx

}

...

const TOOLIDS = DEBUG ? debug_tools : release_tools;


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

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

   

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

...

   

但如果图片这一列前面不确定有多少列就麻烦了,曾经尝试在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层写死了处理,既然怎么都不能完全动态适配,那本着最小修改的策略,用了最偷懒的一种写法:

    

scope和slot-scope

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

vue使用过程踩坑【持续更新】_第1张图片
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返回数据来动态加载不同的子组件:

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作用域的问题,两种改法:不论哪种为了避免影响其他弹框,现在需要的弹框外添加一层

1)如果样式放在