• 背景:应用系统中存在多个创建实体表单,表单填写时,在填写中文名称后,要填写对应的英文名作为标识或数据库查询索引。
  • 需求:填写中文名的同时,系统自动生成英文名并填充到表单中,辅助用户操作,节约操作时间。

实现效果

方案调研

对需求进行分析后,对于如何将中文名翻译成英文字符串,调研以下方案:

  • 调用翻译引擎

    优点:翻译准确,对于短句也能翻译

    缺点:部署难度大,需要捆绑翻译引擎
  • 调用开放API(谷歌翻译/百度翻译等)

    优点:能完成翻译功能

    缺点:可能需要付费/开发者帐号等,需要集成成本,需要私有化部署版本时(无法连接外网)可能无法实现
  • 使用音译插件(参考:https://github.com/dzcpy/transliteration)

    优点:轻量,集成简单,有一定可扩展性,可离线

    缺点:无法翻译,只能音译(会将“你好”翻译成“ni_hao”而不是“hello"),使标识的可读性和语义性下降。

以上三种仅为中转英的方法不同,均可实现功能。本次方案暂使用第三种。

实现方案

  • 分析:该功能需要增加到多个表单中,如果为每个需要添加的组件都增加相应逻辑,侵入性较强,也不好维护。
  • 逻辑提炼:
  1. 为中文名的输入框绑定监听事件,监听输入,取得该input框输入的值
  2. 将第一步中获得的中文值转化成英文字符串
  3. 将英文字符串写入到英文名输入框中

    思路: 为表单添加vue自定义指令,通过取子节点(根据虚拟节点层级,vnode的子级)的方法,获取到需要操作的dom元素,再在指令逻辑中进行逻辑处理。

代码实现

指令定义

  • 定义v-transliterate 指令(vue自定义指令的定义和使用可参考官方文档,此处不做赘述)
  • transliterate.js
  1. import { transliterate as tr, slugify } from 'transliteration'
  2. export default {
  3. inserted(el, binding, vnode) {
  4. let sourceInputEl = vnode.componentInstance.$children.find(item => item.prop === 'name').$children[1].$el.children[0]
  5. let targetInputEl = vnode.componentInstance.$children.find(item => item.prop === 'key').$children[1].$el.children[0]
  6. let isFirstInput = true;
  7. sourceInputEl.addEventListener('keyup', () => {
  8. // 判断当前标识是否已填写,若已填写,则不再根据中文名称生成
  9. let isEmpty = !targetInputEl.value;
  10. if (isEmpty || !isFirstInput) {
  11. // 一定延迟处理,用户使用几乎无感知
  12. setTimeout(() => {
  13. let transValue = slugify(sourceInputEl.value, { separator: '_' });
  14. let inputEvt = new InputEvent('input', {
  15. inputType: 'insertText',
  16. data: transValue,
  17. dataTransfer: null,
  18. isComposing: false
  19. });
  20. targetInputEl.value = transValue;
  21. targetInputEl.dispatchEvent(inputEvt);
  22. isFirstInput = false;
  23. }, 500);
  24. }
  25. })
  26. }
  27. }

注意事项

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 | 指令实现自动翻译填充英文名功能的更多相关文章

  1. vue指令应用--实现输入框常见过滤功能

    前端开发最常碰到的就是输入框,经常要做各种验证,本公司惯用的需求是直接屏蔽特定字符的输入,如禁止非数字输入,特殊符号输入,空格输入等,这些功能反复使用,做成指令的形式,直接调用,非常方便,上代码: 目 ...

  2. vue指令v-html中使用过滤器filters功能

    Vue 2.0 不再支持在 v-html 中使用过滤器 解决方法: 1:全局方法(推荐) 2:computed 属性 3:$options.filters(推荐) 1:使用全局方法: 可以在 Vue ...

  3. 一个能拖动,能调整大小,能更新bind值的vue指令-vuedragx

    一. 背景说明 开发一个可自定义组件化门户配置页面,期间采用了vue框架作为前端视图引擎,作为一个刚入手vue的萌新,开发第一个功能就遇到了拦路虎.需要一个拖动并且可改变大小的容器盒子.当时查看vue ...

  4. 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.数据驱动.双向绑定 ...

  5. Vue学习笔记【4】——Vue指令之v-on

    Vue指令之v-on v-on指令介绍 直接使用指令v-on 使用简化指令@ 绑定事件代码:@事件名="methods中的方法名称" <!DOCTYPE html> & ...

  6. 第三篇:Vue指令

    Vue指令 1.文本指令相关 v-*是Vue指令,会被vue解析,v-text="num"中的num是变量(指令是有限的,不可以自定义) v-text是原样输出渲染内容,渲染控制的 ...

  7. vue2,vue指令和选项

    vue特点 mvvm框架 响应式(声明式) 组件化(支持自定义组件) 丰富的指令(Dom功能的抽象) 基于选项(template,data,computed,watch,methods) vue文档集 ...

  8. 给织梦DEDECMS添加栏目图片与英文名显示

    开始做微网站了,不同于传统手机网站,因为微信上的微网站是支持CSS3与HTML5的,好吧,各种要学习的还有很多很多阿~这么多新代码,叹! 本来想转战帝国CMS了,奈何这名字太不对味了,PHPCMS也懒 ...

  9. vue指令总结(二)

    一.vue指令 1.v-text v-text是用于操作纯文本,它会替代显示对应的数据对象上的值.当绑定的数据对象上的值发生改变,插值处的内容也会随之更新.注意:此处为单向绑定,数据对象上的值改变,插 ...

随机推荐

  1. 面试题:ApplicationContext和BeanFactory两种容器区别

    ApplicationContext和BeanFactory两种容器区别 BeanFactory是ApplicationContext容器的父接口 BeanFactory(多例模式): BeanFac ...

  2. vue自定义插件封装,实现简易的elementUi的Message和MessageBox

    vue自定义插件封装示例 1.实现message插件封装(类似简易版的elementUi的message) message组件 <template>     <transition  ...

  3. Python中切片的应用

    Python中切片的应用 Python中可以通过切片实现对列表或者字符串取指定范围的操作,实际就是通过对列表或者字符串通过索引进行操作. 具体细节点击廖雪峰Python教程,其中的课后小问题在此记录下 ...

  4. UnitTwoSummary

    目录 一.设计策略与程序分析 第一次作业 第二次作业 第三次作业 二.可扩展性检查与分析 三.bug 四.总结与反思 一.设计策略与程序分析 第一次作业 设计思路 输入,调度器,电梯分别设置成三个线程 ...

  5. leetcode 刷题(数组篇)1题 两数之和(哈希表)

    题目描述 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标. 你可以假设每种输入只会对应一个答案.但是,数组中同一个元 ...

  6. 我与Git的那些破事(上)--代码管理

    1. Git是什么? 作为一名程序猿,我相信大家都或多或少接触过git--分布式版本控制软件. 有人说,它是目前世界上最先进的分布式版本控制系统,我想说,是否最先进不知道,但确实好用,实用. 作为一款 ...

  7. day8.函数基础

    一.函数介绍 1.什么是函数     函数就是盛放代码的容器,把实现某一功能的一组代码丢到一个函数中     就做成了一个小工具       具备某一功能的工具->函数     事先准备工具的过 ...

  8. C#入门到精通系列课程——第3章变量及运算符

    ◆本章内容 (1)变量是什么 (2)变量的声明及初始化 (3)常量 (4)运算符 (5)数据类型转换 (6)运算符优先级及结合性 (7)难点解答 ◆本章简述 很多人认为学习C#之前必须要学习C++,其 ...

  9. 使用numba加速python科学计算

    技术背景 python作为一门编程语言,有非常大的生态优势,但是其执行效率一直被人诟病.纯粹的python代码跑起来速度会非常的缓慢,因此很多对性能要求比较高的python库,需要用C++或者Fort ...

  10. 【ElasticSearch】文档路由的原理

    ElasticSearch集群环境下新增文档如何确认该文档被分配到哪个分片中? 路由算法: ⾸先这肯定不会是随机的,否则将来要获取⽂档的时候我们就不知道从何处寻找了.实际上,这个过程是根据下⾯这个公式 ...