react输入框输入中文bug

一般来说,react上我们都会用change事件去处理input的输入,但这样就导致一个问题,在输入中文的时候,我们还没输入完成就会触发change事件,这样显然不是理想状况。

那么,怎么解决这个问题呢?首先,你需要了解3个事件,compositionstart,compositionupdate和compositionend。什么意思呢?

compositionstart

要开始输入中文

compositionupdate

插入新字符

compositionend

输入完成

下面是一段代码,可以copy试一下

    class App extends React.Component {
        constructor(props) {
            super(props)
        }

    compositionstart(event) {
        console.log(‘开始输入‘, event.data);
    }

    compositionupdate(event) {
        console.log(‘正在输入的数据‘, event.data);
    }

    compositionend(event) {
        console.log(‘结束输入‘, event.data);
    }

    changeEvent() {
        console.log(‘改变‘);
    }

    render() {
        return (
          <div>
              <input type="text" id="test" onChange={this.changeEvent.bind(this)}
                     onCompositionStart={this.compositionstart.bind(this)}
                     onCompositionUpdate={this.compositionupdate.bind(this)}
                     onCompositionEnd={this.compositionend.bind(this)}/>
          </div>
        )
    }
}
window.onload = function () {
    ReactDOM.render(
        <App/>,
        document.getElementById(‘root‘)
    )
}

需要注意的是,要引入react和babel

明白这几个事件之后,怎么办呢?看这里

var isOnComposition = true;
const isChrome = !!window.chrome && !!window.chrome.webstore
class App extends React.Component {
    constructor(props) {
        super(props)
    }

    handleComposition(e) {
        console.log(‘type‘, e.type)
        if (e.type === ‘compositionend‘) {
            // composition is end
            isOnComposition = false

            if (!isOnComposition && isChrome) {
                // fire onChange
                this.changeEvent(e);
            }
        } else {
            // in composition
            isOnComposition = true
        }
    }

    changeEvent() {
        if (!isOnComposition) {
            console.log(‘改变‘);
        }
    }

    render() {
        return (
          <div>
              <input type="text" id="test" onChange={this.changeEvent.bind(this)}
                     onCompositionStart={this.handleComposition.bind(this)}
                     onCompositionUpdate={this.handleComposition.bind(this)}
                     onCompositionEnd={this.handleComposition.bind(this)}/>
          </div>
        )
    }
}
window.onload = function () {
    ReactDOM.render(
        <App/>,
        document.getElementById(‘root‘)
    )
}

我们定义一个中间变量isOncomposition,默认为true,当触发compositionend事件时,我们把它赋为false,这样change事件才会执行自己的方法。需要注意的是在chrome浏览器中,change方法会先于compositionend事件执行,这样的话在最后,change方法执行完成之后,才会执行compositionend中的方法,将isOncomposition设为false。这样就不会执行change的方法了。怎么办呢?就是在compositionend中加一个判断!isOnComposition && isChrome,只有当chrome浏览器,才会在compositionend结束,执行change的方法。

github地址如下,欢迎大家查看

react-input

原文地址:https://www.cnblogs.com/yky-iris/p/9148151.html

时间: 2024-10-21 19:00:06

react输入框输入中文bug的相关文章

JavaScript控制输入框中只能输入中文、数字和英文

1.问题背景 遇到这样一个问题:有一个输入框,要求只能输入中文.数字和英文(即过滤特殊字符串) 2.JS代码 function  checkUsername() { //正则表达式 var reg = new RegExp("^[a-zA-Z\d\u4E00-\u9FA5]+$"); //获取输入框中的值 var username = document.getElementById("username").value.trim(); //判断输入框中有内容 if(u

PhpStorm 2016.3 For Mac 重大里程碑更新 -- 终于解决了不能输入中文标点符号的重大bug

PhpStorm 2016.3 For Mac 重大里程碑更新 1.[终于解决了]不能输入中文标点符号的重大bug,如 逗号“,”.“.”: 2.可以在一个窗体中,同时打开多个项目: 3.其他... 2016.11.24 发布了 PhpStorm Version: 2016.3 正式版   Build: 163.7743.50 Frameworks, Tools, more: Support of Docker in Remote Interpreters, support of PHPSpec

Snap Build Your Own Blocks输入中文解决办法

Snap Build Your Own Blocks输入中文解决办法 Snap! (formerly BYOB) is a visual, drag-and-drop programming language. It is an extended reimplementation of Scratch (a project of the Lifelong Kindergarten Group at the MIT Media Lab) that allows you to Build Your

Linux 下 Sublime Text 添加 InputHelper 插件输入中文

Linux 下的 Sublime Text 不支持中文输入,我也是醉了. 网上找了一些方法,都没有成功,最后就用 InputHelper 折中一下了,虽然麻烦,但好歹能写中文了. InputHelper 因为是以弹出个窗口方式输入,所以理论上支持系统所使用的所有中文输入法. 安装方法: $ cd ~/.config/sublime-text-3/Packages $ git clone https://github.com/xgenvn/InputHelper.git 或者 去下载 InputH

向不支持输入法的软件输入中文

问题 今天试了下 x2go 的 single application 模式,第一感觉很不错,可以把远程系统中的软件在本地打开,看上去就像打开本地的软件一样. 美中不足的就是没办法输入中文,首先远程系统的输入法没办法在这个模式下使用,而本地系统的输入法也同样不能正常工作,搞得我只能另外开个文本框输了中文粘贴过去. 不能忍 这已经不是我第一次遇到没办法输入中文的情况了.更可恶的是软件本身是支持中文的,就是没办法直接往里输中文,只能从别的地方贴过去,切来切去浪费时间不说,还打断思路. Ditto 我装

JavaScript表单验证,输入中文时字符长度为2

获取输入框中的字符长度进行表单验证,当输入英文时字符长度就是1,当输入中文时字符长度为2. 字符数为4~16位, 上图: 一个中文抵两英文. 上代码 1 btn.addEventListener('click',ov,false); 2 3 function ov(){ 4 var inputValue = text.value.trim(); 5 //去掉最前最后的空格 6 if (countLength(inputValue) < 4 || countLength(inputValue) >

JS常用正则表达式和JS控制输入框输入限制(数字、汉字、字符)

验证数字:^[0-9]*$验证n位的数字:^\d{n}$验证至少n位数字:^\d{n,}$验证m-n位的数字:^\d{m,n}$验证零和非零开头的数字:^(0|[1-9][0-9]*)$验证有两位小数的正实数:^[0-9]+(.[0-9]{2})?$验证有1-3位小数的正实数:^[0-9]+(.[0-9]{1,3})?$验证非零的正整数:^\+?[1-9][0-9]*$验证非零的负整数:^\-[1-9][0-9]*$验证非负整数(正整数 + 0) ^\d+$验证非正整数(负整数 + 0) ^((

解决Ubuntu下sublime中不能输入中文的问题

解决Ubuntu下sublime中不能输入中文的问题 Ubuntu下安装sublime后,不能输入中文,而在其他软件中能正常输入,这是sublime的bug,解决方案是在通过shell在每次运行sublime前自动添加一个动态修正库,解决过程如下: 进入某个目录如-: cd 新建一个C源代码 subl sublime-imfix.c 并粘贴入如下代码: #include <gtk/gtkimcontext.h> void gtk_im_context_set_client_window (Gt

phpstorm9 无法输入中文逗号句号等符号了,怎么破?

最近手贱把phpstorm 升级到了最新版,发现输入中文符号输入不了呀,全部都变成英文符号了,例如输入的逗号.句号(,.)等都被转换成了(,.) 经过各方搜索,这个在官方也说了,是个bug,JDK的bug,点击这里去官方查看 目前官方还没有解决补丁,只有降低JDK版本了,目前测试出来 jdk1.8.0_45是可以的, 下载地址:http://www.oracle.com/technetwork/java/javase/downloads/java-archive-javase8-2177648.