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是用于操作纯文本,它会替代显示对应的数据对象上的值.当绑定的数据对象上的值发生改变,插值处的内容也会随之更新.注意:此处为单向绑定,数据对象上的值改变,插 ...
随机推荐
- C语言结构体及其内存布局
code[class*="language-"], pre[class*="language-"] { color: rgba(51, 51, 51, 1); ...
- Java系列教程-SpringMVC教程
SpringMVC教程 1.SpringMVC概述 1.回顾MVC 1.什么是MVC MVC是模型(Model).视图(View).控制器(Controller)的简写,是一种软件设计规范. 是将业务 ...
- LevelDB 源码解析之 Arena
GitHub: https://github.com/storagezhang Emai: debugzhang@163.com 华为云社区: https://bbs.huaweicloud.com/ ...
- Java例题_48 四位数据加密
1 /*48 [程序 48 加密] 2 题目:某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的, 3 加密 规则如下: 4 每位数字都加上 5,然后用和除以 10 的余数代替该数字 ...
- KMP字符串匹配学习笔记
部分内容引自皎月半洒花的博客 模式串匹配问题模型给定一个需要处理的文本串和一个需要在文本串中搜索的模式串,查询在该文本串中,给出的模式串的出现有无.次数.位置等.算法思想每次失配之后不会从头开始枚举, ...
- mysql大于当前时间置顶并按升序排序,小于当前时间的置尾并按降序排序
现在用id来代替时间这样好测试 看一下测试表数据 执行按需求规则排序的sql SELECT * FROM number_generator ORDER BY id < 16 , IF(id &l ...
- SQLlite实现增删查改
activity_main.xml文件: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android ...
- 详解DNS重绑定攻击
0x00 前言 DNS重绑定攻击的用法有很多种,这篇文章主要理解DNS重绑定攻击的原理,并介绍如何通过DNS重绑定来攻击内网设备.为了更好的理解DNS重绑定攻击,我们先从Web浏览器的同源策略开始介绍 ...
- malloc 函数分析 glibc2.23
malloc 函数详解 本篇主要是参考了glibc 2.23的源码 首先我们来看看malloc函数的执行流程. strong_alias (__libc_malloc, __malloc) stron ...
- Oracle-DG 主库将log_archive_dest_state_2远程归档线程参数设置为defer,为什么dg还是处于实时同步状态?
一.需求,前段时间,墨天伦有个小伙伴咨询了这个问题,搞了测试环境测试下. Oracle-DG 主库将log_archive_dest_state_2远程归档线程参数设置为defer,为什么dg还是处于 ...