概述
用 Vue 生态重构已有的老项目(jsp+jquery),针对目前实践中遭遇的一些坑,做下小结。具体包括:URL 转换规则、element-ui 自定义校验、el-table
组件删除问题、自定义组件v-model
使用和sync
修饰符。
详述
初始化项目直接用的 vue-cli,安装全家桶(router、vuex),代码规范选用的 Prettier,配置文件选择放在单独文件,ui 库用 element-ui。
URL 转换规则
对于资源的引用路径,可以用相对路径,也可以用绝对路径,但是实际中,对于嵌套太深的一般使用绝对路径比较合适。在 vue-cli 初始化的项目中默认设置了@
别名作为 src 根目录,当然我们也可以在 webpack 配置文件中设置更多的别名。
在 js 中引用资源的相对路径与绝对路径示例如下:
1 | // 简洁 |
既然使用别名这么方便,那么在 css 中引用图片也这样搞吧:
1 | .select-flag { |
结果报错如下:
1 | Failed to compile. |
细看这个报错信息,可知 css-loader 编译时没有找到引用的资源。解决方式为:background: url("~@/assets/milan/common/img/icon/flags.png") no-repeat;
。原因是,@
与~
开头都会作为一个模块请求被解析,但是@
开头仅作用域模板中。详细见官网。
element-ui 自定义校验
element 的表单校验与 ant-d 一样都是用的第三方库async-validator 。因为 element-ui 官网这块只是一带而过,详细的还是要查看该集成库的文档。下面以自定义同步校验与异步校验为例:
1 | ... |
想着校验函数复用,一开始根据 element 示例,想着用一个高阶函数传入 message 生成 validator 函数。后来发现rule
参数就是指向我们配置的规则对象,因此直接在 rules 中配置 message 即可,当然也可以增加其他参数供 validator 函数使用。
el-table
组件删除问题
问题很小,就是用了官方示例,删除成功,但是不是对应的那一条:
检查代码:
1 | <el-table |
1 | handleDelete(index, row) { |
没啥问题啊。唉!最后发现加了默认排序,导致展示的顺序与实际的数据顺序不一致,当然根据索引删除也就对不上号了。因此,有排序的,只能通过唯一性的字段,如id,来进行查询筛选了。
自定义组件 v-model 使用
一个组件上的 v-model 默认会利用名为 value 的 prop 和名为 input 的事件,但是像单选框、复选框等类型的输入控件可能会将 value 特性用于不同的目的。model 选项可以用来避免这样的冲突:
1 | <my-checkbox v-model="foo" value="some value"></my-checkbox> |
1 | Vue.component('my-checkbox', { |
sync 修饰符
原以为加了 sync 的 prop 就可以像普通的 data 定义变量一样使用,结果当然是错的。其实只是一种针对通过自定义事件修改 prop 的一种简写。使用这种简写的前提是约定自定义事件名为update:xxx
,其实只是通过约定,减少了传入事件函数,对于子组件还是需要调用$emit
方法去触发。示例如下:
1 | <text-document |
1 | // 子组件中触发赋值意图 |