帮我封装react inputnumber 组件输入时取消千分符空格各种符号失焦时显示千分符

我原本在 属性format里面用3元控制的,onfocus控制true onblur 为false控制的可是封装时定义的参数在format没变化,求解

您可以在React InputNumber组件的onChange事件中去除千分符和其他符号,然后在onBlur事件中添加千分符。以下是一个示例代码:

import { InputNumber } from 'antd';

class MyInputNumber extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      value: '',
    };
  }

  handleChange = (value) => {
    // 去除千分符和其他符号
    const newValue = value.replace(/[^\d.]/g, '');
    this.setState({ value: newValue });
  }

  handleBlur = (e) => {
    const { value } = this.state;
    // 添加千分符
    const formattedValue = parseFloat(value).toLocaleString();
    this.setState({ value: formattedValue });
  }

  render() {
    const { value } = this.state;
    return (
      <InputNumber
        value={value}
        onChange={this.handleChange}
        onBlur={this.handleBlur}
      />
    );
  }
}

这个组件会在输入时去除千分符和其他符号,然后在失去焦点时添加千分符。您可以在自己的项目中使用类似的方法来实现您的需求。


import React, { useState } from "react";
 
const All = ()=>{
 
    const [aValue, setAValue] = useState('')
 
    const a = ()=>{
        return (
            <div>
                <input
                    value={aValue}
                    onInput={(e)=>{
                       e.persist()
                       setAValue(e.target.value)
                    }}
                />
            </div>
        )
    }
 
    return (
        <div>
            {
               a()
            }
        </div>
    )
}
 
export default All;

在React中封装组件可以使用props参数将父组件传递给子组件。为了解决输入时取消千分符、失焦时显示千分符的问题,可以利用React的生命周期钩子函数来实现。

首先,你可以在react inputnumber组件上绑定onBlur和onChange事件,使用React的状态管理功能来控制组件状态。

具体实现过程如下:

  1. 在constructor中定义一个state,用于控制是放弃千分位分隔符还是强制分隔。并且定义一个initialValue属性,用来保存用户的输入。
  2. 在onChange事件中对用户的输入进行处理,在发生变化时调用setState方法对state进行更新,同时更新initialValue。
  3. 在onBlur事件中根据state的值来决定是否应该以千分位格式显示数值。

示例代码如下:

class CustomInputNumber extends React.Component {
  constructor(props) {
    super(props);

    // 定义状态
    this.state = {
      isSeparated: true,
      initialValue: 0,
    };

    // 绑定this
    this.handleBlur = this.handleBlur.bind(this);
    this.handleChange = this.handleChange.bind(this);
  }

  // 处理输入值
  handleChange(e) {
    let value = e.target.value;

    // 去除千分位分隔符
    value = value.replace(/,/g, '');
    
    // 将新值设置为state
    this.setState({ 
        initialValue: value, 
        isSeparated: this.state.isSeparated,
    });

    // 调用父组件的onChange事件 (如果有的话)
    if (this.props.onChange) {
        this.props.onChange(value);
    }
  }

  // 处理失焦
  handleBlur(e) {
    const { isSeparated, initialValue } = this.state;
      
    // 将值设置为千分位分隔符格式
    const formattedValue = isSeparated ? Number(initialValue).toLocaleString() : initialValue;
    
    this.setState({ 
        initialValue: formattedValue, 
        isSeparated: true, // 设置为true 以显示千分位格式
    });
  }

  render() {
    return (
       <input
         type="number"
         onBlur={this.handleBlur}
         onChange={this.handleChange}
         value={this.state.initialValue}
       />
    );
  }
}

在这个示例中,input的值是由initialValue和isSeparated两个state共同控制的。handleChange处理输入值,去除千分位分隔符并更新状态,handleBlur按照state中的值来决定是否应该以千分位格式显示数值。

你这个题目,有点不够清晰,建议明确下你具体要求

该回答参考ChatGPT:

import React, { useState } from 'react';
import NumberFormat from 'react-number-format';

const InputNumber = ({ value, onChange }) => {
  const [formattedValue, setFormattedValue] = useState(value);

  const handleValueChange = (values) => {
    const { value } = values;
    setFormattedValue(value);
    onChange(value.replace(/[^0-9]/g, ''));
  };

  const handleBlur = () => {
    setFormattedValue(value.toLocaleString());
  };

  return (
    <NumberFormat
      value={formattedValue}
      onValueChange={handleValueChange}
      onBlur={handleBlur}
      thousandSeparator
      allowNegative={false}
      prefix=""
    />
  );
};


export default InputNumber;
这个组件使用了 react-number-format 库来格式化输入的数字。在 handleValueChange 函数中,我们使用正则表达式将输入的值中的非数字字符替换为空字符串。在 handleBlur 函数中,我们使用 toLocaleString 方法将输入的值格式化为带有千分符的字符串。最后,我们将格式化后的值传递给 NumberFormat 组件,并设置 thousandSeparator 属性为 true,以显示千分符。

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
你可以参考以下代码示例,封装一个 React InputNumber 组件,以实现输入时取消千分符和空格,失焦时显示千分符。

import React, { useState } from "react";

const InputNumber = (props) => {
  const [formattedValue, setFormattedValue] = useState("");

  const formatValue = (value) => {
    // 取消千分符和空格
    const newValue = value.replace(/[\s,]+/g, "");
    // 转换为数字
    const numberValue = Number(newValue);
    // 显示千分符
    const formattedNumber = new Intl.NumberFormat().format(numberValue);
    return formattedNumber;
  };

  const handleInputChange = (event) => {
    const newValue = event.target.value;
    // 格式化输入的值
    const formattedNumber = formatValue(newValue);
    // 更新组件的状态
    setFormattedValue(formattedNumber);
    // 调用父组件的回调函数
    props.onChange && props.onChange(formattedNumber);
  };

  const handleInputBlur = (event) => {
    const newValue = event.target.value;
    // 格式化输入的值
    const formattedNumber = formatValue(newValue);
    // 更新组件的状态
    setFormattedValue(formattedNumber);
    // 调用父组件的回调函数
    props.onBlur && props.onBlur(formattedNumber);
  };

  return (
    <input
      type="text"
      value={formattedValue}
      onChange={handleInputChange}
      onBlur={handleInputBlur}
      placeholder={props.placeholder}
      disabled={props.disabled}
    />
  );
};

export default InputNumber;

在上面的代码中,formatValue 函数用于格式化输入的值。它使用正则表达式取消千分符和空格,并通过 Intl.NumberFormat 类显示千分符。

然后,handleInputChange 函数处理输入事件。它首先调用 formatValue 函数格式化输入的值,然后更新组件的状态,最后调用父组件传递的 onChange 回调函数。

handleInputBlur 函数处理失焦事件。它与 handleInputChange 函数类似,不同的是它把父组件传递的 onBlur 回调函数作为参数调用。

将上面的代码复制到你的项目中,并使用 <InputNumber> 标签即可使用。例如:

<InputNumber
  onChange={(value) => console.log("输入值为", value)}
  onBlur={(value) => console.log("失焦值为", value)}
  placeholder="请输入数字"
  disabled={false}
/>

如果我的回答解决了您的问题,请采纳!

以下答案由GPT-4.5Plus大模型(语音)与博主A努力中.......共同编写:

可以这样封装一个InputNumber组件:

jsx
import React, { useState } from 'react';

function InputNumber(props) {
  const [focus, setFocus] = useState(false);
  const [value, setValue] = useState(props.value);

  const onChange = (e) => {
    let newValue = e.target.value;
    if (focus) {
      newValue = newValue.replace(/[^\d]/g, '');  // 过滤非数字输入
    } else {
      newValue = newValue.replace(/\B(?=(\d{3})+(?!\d))/g, ','); // 添加千分符
    }
    setValue(newValue);
    props.onChange(newValue);
  };

  const onFocus = () => {
    setFocus(true);
    setValue(value.replace(/[^\d]/g, ''));  // 聚焦时去除千分符 
  };

  const onBlur = () => {
    setFocus(false);
    setValue(value.replace(/\B(?=(\d{3})+(?!\d))/g, ','));  // 失焦时添加千分符
  };

  return (
    <input 
      type="text" 
      value={value}
      onChange={onChange}
      onFocus={onFocus}
      onBlur={onBlur}
    />
  );
}

export default InputNumber;

这个组件实现了:

  • onChange时,聚焦状态下过滤非数字输入,失焦状态下添加千分符
  • onFocus时去除输入值的千分符
  • onBlur时为输入值添加千分符

这样,在使用该组件时,我们只需要传入value和onChange就可以实现你要的功能,格式化逻辑被封装在组件内。

使用方法:

jsx
<InputNumber value={this.state.number} onChange={(value) => this.setState({ number: value })} />

这个组件实现了你要的“输入时取消千分符空格各种符号失焦时显示千分符”的功能。