react input 输入中文拼音和onChange事件的交互

Posted gauzung

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了react input 输入中文拼音和onChange事件的交互相关的知识,希望对你有一定的参考价值。

需求:封装Input组件,输入拼音过程不触发onChange,拼音输入结束才触发onChange
原理:输入拼音过程触发composition事件,英文/数字输入不触发,而onChange两者都触发,用一个锁控制onChange的时机
问题:无法做到MyInput只向外暴露onChange事件,且使得MyInput受控
解决受控问题参考:react根据中文获取拼音_解决 React 中的 input 输入框在中文输入法下的 bug

Input组件:

// MyInput.jsx

import { Component } from "react";

class Input extends Component {
    constructor(p) {
        super(p);

        this.lock = false;
    }

    componentDidMount() {
        this.setInputValue();
    }

    componentDidUpdate(pp) {
        if (this.props.value !== pp.value) {
            this.setInputValue();
        }
    }

    handleCompositionStart = () => (this.lock = true);

    handleCompositionUpdate = () => (this.lock = true);

    setInputValue = () => {
        const { value } = this.props;
        this.refs.input.value = value;
    };

    handleCompositionEnd = (e) => {
        // const { onChange } = this.props;
        // let input = e.target.value;
        this.lock = false;

        // onChange(input);
    };

    handleChange = (e) => {
        const { onChange } = this.props;
        let input = e.target.value;

        if (!this.lock) {
            onChange(input);
        }
    };

    render() {
        return (
            <input
                ref="input"
                onCompositionStart={this.handleCompositionStart}
                onCompositionUpdate={this.handleCompositionUpdate}
                onCompositionEnd={this.handleCompositionEnd}
                onChange={this.handleChange}
            />
        );
    }
}

export default Input;

使用:


// App.jsx
const App = () => {
    const [input, setValue] = useState("");
    
    return <MyInput onChange={handleChange} value={input}/>;
};

以上是关于react input 输入中文拼音和onChange事件的交互的主要内容,如果未能解决你的问题,请参考以下文章

JS实现输入拼音搜索中文列表

使用 React 和 TypeScript 为输入元素创建一个键处理程序 [重复]

实时监控input输入值变化

input输入中文未完成时触发change事件

react下将输入的汉字转化为拼音

即时反应的input和propertychange方法