Vue | 指令实现自动翻译填充英文名功能
- 背景:应用系统中存在多个创建实体表单,表单填写时,在填写中文名称后,要填写对应的英文名作为标识或数据库查询索引。
- 需求:填写中文名的同时,系统自动生成英文名并填充到表单中,辅助用户操作,节约操作时间。
实现效果
方案调研
对需求进行分析后,对于如何将中文名翻译成英文字符串,调研以下方案:
- 调用翻译引擎
优点:翻译准确,对于短句也能翻译
缺点:部署难度大,需要捆绑翻译引擎 - 调用开放API(谷歌翻译/百度翻译等)
优点:能完成翻译功能
缺点:可能需要付费/开发者帐号等,需要集成成本,需要私有化部署版本时(无法连接外网)可能无法实现 - 使用音译插件(参考:https://github.com/dzcpy/transliteration)
优点:轻量,集成简单,有一定可扩展性,可离线
缺点:无法翻译,只能音译(会将“你好”翻译成“ni_hao”而不是“hello"),使标识的可读性和语义性下降。
以上三种仅为中转英的方法不同,均可实现功能。本次方案暂使用第三种。
实现方案
- 分析:该功能需要增加到多个表单中,如果为每个需要添加的组件都增加相应逻辑,侵入性较强,也不好维护。
- 逻辑提炼:
- 为中文名的输入框绑定监听事件,监听输入,取得该input框输入的值
- 将第一步中获得的中文值转化成英文字符串
- 将英文字符串写入到英文名输入框中
思路: 为表单添加vue
自定义指令,通过取子节点(根据虚拟节点层级,vnode
的子级)的方法,获取到需要操作的dom元素,再在指令逻辑中进行逻辑处理。
代码实现
指令定义
- 定义
v-transliterate
指令(vue自定义指令的定义和使用可参考官方文档,此处不做赘述) transliterate.js
import { transliterate as tr, slugify } from 'transliteration'
export default {
inserted(el, binding, vnode) {
let sourceInputEl = vnode.componentInstance.$children.find(item => item.prop === 'name').$children[1].$el.children[0]
let targetInputEl = vnode.componentInstance.$children.find(item => item.prop === 'key').$children[1].$el.children[0]
let isFirstInput = true;
sourceInputEl.addEventListener('keyup', () => {
// 判断当前标识是否已填写,若已填写,则不再根据中文名称生成
let isEmpty = !targetInputEl.value;
if (isEmpty || !isFirstInput) {
// 一定延迟处理,用户使用几乎无感知
setTimeout(() => {
let transValue = slugify(sourceInputEl.value, { separator: '_' });
let inputEvt = new InputEvent('input', {
inputType: 'insertText',
data: transValue,
dataTransfer: null,
isComposing: false
});
targetInputEl.value = transValue;
targetInputEl.dispatchEvent(inputEvt);
isFirstInput = false;
}, 500);
}
})
}
}
注意事项
1、transValue的生成可根据前面所说的不同方案,更改生成的方法。
2、两个input 元素是根据prop来筛选的,代码中硬编码为”name“ -中文名 和”key“ 英文名,可根据需求调整,也可以根据指令方法入参的binding赋值。由于本项目中所有表单prop都是固定的,所以没有写相应逻辑。
3、keyup
事件可根据需求更改为blur
事件,对于调用后台api获值,可考虑改为blur,降低频繁请求。
4、执行 targetInputEl.value = transValue;
后,页面上显示已经改变,但点击保存表单时仍然会触发空值校验,怀疑是因为该赋值没有刷新到虚拟节点的model中,故而使用 targetInputEl.dispatchEvent(inputEvt);
方法模拟输入事件,触发值的刷新。
5、isEmpty
空值校验,避免用户在填写表单时先填写了英文名,再填写中文名时,英文名被覆盖。逻辑一般限定标识生成后就不允许修改,该方法也规避了修改时的英文名跟着中文名修改的问题。
6、使用transliterate
可定义配置字典,实现常用中-英单词的翻译,但仍然无法替代翻译引擎。配置逻辑参考github上的README即可。
slugify.config({ replace: [['世界','world'],['你好','hello']] });
指令使用
需要用该功能的地方,在表单元素增加该指令即可。
总结
以上就是实现全过程,如果有更好的实现方法,请留言告诉我哦~
Vue | 指令实现自动翻译填充英文名功能的更多相关文章
- vue指令应用--实现输入框常见过滤功能
前端开发最常碰到的就是输入框,经常要做各种验证,本公司惯用的需求是直接屏蔽特定字符的输入,如禁止非数字输入,特殊符号输入,空格输入等,这些功能反复使用,做成指令的形式,直接调用,非常方便,上代码: 目 ...
- vue指令v-html中使用过滤器filters功能
Vue 2.0 不再支持在 v-html 中使用过滤器 解决方法: 1:全局方法(推荐) 2:computed 属性 3:$options.filters(推荐) 1:使用全局方法: 可以在 Vue ...
- 一个能拖动,能调整大小,能更新bind值的vue指令-vuedragx
一. 背景说明 开发一个可自定义组件化门户配置页面,期间采用了vue框架作为前端视图引擎,作为一个刚入手vue的萌新,开发第一个功能就遇到了拦路虎.需要一个拖动并且可改变大小的容器盒子.当时查看vue ...
- Vue框架(一)——Vue导读、Vue实例(挂载点el、数据data、过滤器filters)、Vue指令(文本指令v-text、事件指令v-on、属性指令v-bind、表单指令v-model)
Vue导读 1.Vue框架 vue是可以独立完成前后端分离式web项目的js框架 三大主流框架之一:Angular.React.Vue vue:结合其他框架优点.轻量级.中文API.数据驱动.双向绑定 ...
- Vue学习笔记【4】——Vue指令之v-on
Vue指令之v-on v-on指令介绍 直接使用指令v-on 使用简化指令@ 绑定事件代码:@事件名="methods中的方法名称" <!DOCTYPE html> & ...
- 第三篇:Vue指令
Vue指令 1.文本指令相关 v-*是Vue指令,会被vue解析,v-text="num"中的num是变量(指令是有限的,不可以自定义) v-text是原样输出渲染内容,渲染控制的 ...
- vue2,vue指令和选项
vue特点 mvvm框架 响应式(声明式) 组件化(支持自定义组件) 丰富的指令(Dom功能的抽象) 基于选项(template,data,computed,watch,methods) vue文档集 ...
- 给织梦DEDECMS添加栏目图片与英文名显示
开始做微网站了,不同于传统手机网站,因为微信上的微网站是支持CSS3与HTML5的,好吧,各种要学习的还有很多很多阿~这么多新代码,叹! 本来想转战帝国CMS了,奈何这名字太不对味了,PHPCMS也懒 ...
- vue指令总结(二)
一.vue指令 1.v-text v-text是用于操作纯文本,它会替代显示对应的数据对象上的值.当绑定的数据对象上的值发生改变,插值处的内容也会随之更新.注意:此处为单向绑定,数据对象上的值改变,插 ...
随机推荐
- Spring与Mybatis整合配置
Mybatis核心配置文件: 配置文件内可以不写内容 <?xml version="1.0" encoding="UTF-8" ?> <!DO ...
- Ansible 教程
[注]本文译自:https://www.edureka.co/blog/ansible-tutorial/ 在阅读本文之前,你应该已经知道,Ansible 构成了 DevOps 认证的关键部分,它 ...
- 201871030109-韩诚 实验一 软件工程准备—Blog
项目 内容 课程班级博客链接 18级卓越班 这个作业要求链接 软件工程准备-Blog 我的课程学习目标 (1)学习博客园软件开发者学习社区使用技巧和经验(2) 掌握软件工程导论这门课程的基础理论知识 ...
- BUAA_OO_第一单元
BUAA_OO_2020_UNIT1 一.程序结构分析 第一次作业 UML & Mertrics 由于数据处理简单,第一次作业中笔者发挥了面向过程的思想,将项转换成Biginteger, ...
- 自动化kolla-ansible部署ubuntu20.04+openstack-victoria之创建实例-12
自动化kolla-ansible部署ubuntu20.04+openstack-victoria之创建实例-12 欢迎加QQ群:1026880196 进行交流学习 实例创建 1. 创建 2. 查 ...
- @Scheduled注解
1 概述 @Scheduled注解是spring boot提供的用于定时任务控制的注解,主要用于控制任务在某个指定时间执行,或者每隔一段时间执行.注意需要配合@EnableScheduling使用,配 ...
- 一文吃透jQuery选择器!
1 jQuery选择器 jQuery选择器用于选择DOM元素进行相应操作,允许通过多种方式选择,包括标签名,属性名,类名,id等对元素进行选择,基于CSS选择器.jQuery中所有的选择器都以$符号开 ...
- Floyd算法C++实现与模板题应用
简介 Floyd算法算是最简单的算法,没有之一. 其状态转移方程如下map[i , j] =min{ map[i , k] + map[k , j] , map[i , j] }: map[i , j ...
- Rabbitmq 3.6.5以上版本修改端口号方法
Rabbitmq 3.6.5以上版本修改端口号方法,网上查了下有一些方不管用,所以自己实践了引用官网说明 https://www.rabbitmq.com/configure.html#configu ...
- [C#] NAudio 库的各种常用使用方式: 播放 录制 转码 音频可视化
概述 在 NAudio 中, 常用类型有 WaveIn, WaveOut, WaveStream, WaveFileWriter, WaveFileReader 以及接口: IWaveProvider ...