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

示例代码如下:

export default {

data() {

return {

pictableData: {

...

data: [],

}

}

}

}

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

const debug_tools = {

xxx: xx,

xxxx: xx

}

...

const TOOLIDS = DEBUG ? debug_tools : release_tools;

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

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

export default {

data() {

return {

tableData: [{}],

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

}

}

}

现在有个需求,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:

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)如果样式放在

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

width:500px;

}

2)如果样式放在

.div-dialog .el-dialog {

width:500px;

}

如何去掉VUE Router的锚点

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

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

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

adb3e62677fc

去除锚点

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

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

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

adb3e62677fc

click无效问题解决

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

vue week-range-picker实现

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

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

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

adb3e62677fc

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

adb3e62677fc

前端代码实现:

adb3e62677fc

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

adb3e62677fc

Logo

前往低代码交流专区

更多推荐