最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • React输入拼音触发搜索

    正文概述 掘金(Mountain_Z)   2021-03-14   555

    在打造search组件时会经常使用到input组件,但这有一个就是当用户输入拼音时便触发搜索功能有时候这并不是我们想要的。

    假入有如下Input组件

    import React, { Component } from "react";
    
    export default class Input extends Component {
        onChange = (e) => {
            this.props.onChange(e.target.value);
        };
        render() {
            const { value } = this.props;
            return (
                <div
                    style={{
                        border: "2px solid blue",
                        padding: "10px",
                    }}
                >
                    <h3>input组件</h3>
                    <input onChange={this.onChange} value={value} />
                </div>
            );
        }
    }
    

    有如下search组件

    import React, { useState } from "react";
    import Input from "./Input";
    
    function Search() {
       const [value, setValue] = useState("");
       return (
           <>
               <h2>Search组件</h2>
               <Input onChange={setValue} value={value} />
               <div style={{ marginTop: "100px" }}>{value}</div>
           </>
       );
    }
    
    export default Search;
    

    运行结果如下 React输入拼音触发搜索

    很明显输入的拼音也别带过来了,这样就会触发搜索

    compositionstart,compositionend

    这时候就需要引入我们的 compositionstart,compositionend,这两个都是input身上的函数,可以理解为其身上的生命周期函数,会在新的输入合成时调用,详细可在百度上自己查询。我只需要在外部定义一个变量用于监听输入的状态,在我输入拼音时为false输入完成变为true。 修改Input组件代码 写完代码再到浏览器查看居然连拼音都输入不了了!!!

    如何解决

    为什么会出现这种情况??? 因为我们input的value值依赖于props中的value,我们禁止了拼音的输入导致input接收不到拼音也就无法显示了。

    思路:

    在state中设置一个临时变量用于显示用户的输入,而传输给Search组件的是没有拼音的部分,这个临时变量在用户拼音输入完成时和用户在search中的输入保持一致,这时候就需要getDerivedStateFromProps这个生命周期函数来控制state中的value。修改后的Input组件代码如下:

    import React, { Component } from "react";
    
    export default class Input extends Component {
      static getDerivedStateFromProps(props, state) {
          if (props.value !== state.prevPropsValue) {
              return {
                  value: props.value,
                  prevPropsValue: props.value,
              };
          }
          return null;
      }
    
      static flag = true;
    
      state = {
          value: this.props.value,
          prevPropsValue: this.props.value,
      };
    
      onChange = (e) => {
          if (this.flag) {
              this.props.onChange(e.target.value);
          } else {
              this.setState({
                  value: e.target.value,
              });
          }
      };
      onCompositionStart = () => {
          this.flag = false;
      };
      onCompositionEnd = (e) => {
          this.flag = true;
          this.props.onChange(e.target.value);
      };
      render() {
          return (
              <div
                  style={{
                      border: "2px solid blue",
                      padding: "10px",
                  }}
              >
                  <h3>input组件</h3>
                  <input
                      onChange={this.onChange}
                      value={this.state.value}
                      onCompositionStart={this.onCompositionStart}
                      onCompositionEnd={this.onCompositionEnd}
                  />
              </div>
          );
      }
    }
    
    

    最终结果如下

    React输入拼音触发搜索

    如果有问题欢迎指出 :)


    起源地下载网 » React输入拼音触发搜索

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元