每日一个项目:Bin2Dec (T1)

111 阅读1分钟

每日一个项目:Bin2Dec (T1)

项目介绍:github.com/florinpop17…

我的实现:react+styled-components

仓库地址:github.com/Octane0411/…

非常简单的一个项目

const Bin2Dec = () => {
    const [res, setRes] = useState(0)
    const [valid, setValid] = useState(true)
    const [input, setInput] = useState("")
    const onInput = (e) => {
        let str = e.target.value
        let isValid = validBinary(str)
        setValid(isValid)
        if (isValid) {
            setInput(str)
        }
    }
    const onClick = () => {
        let num = parseBinary(input)
        setRes(num)
        console.log(num)
    }
    return (
        <VerticalContainer>
            <Container>
                <Input onChange={onInput} value={input}/>
                <Button onClick={onClick} disabled={!valid}>
                    点我转换
                </Button>
                <Input disabled={true} value={res} onChange={() => res}/>
            </Container>
            {!valid? <Error>请输入0或1</Error>: null}
        </VerticalContainer>
    );
};

共三个状态

  • input: 左边的值
  • res: 右边的值
  • valid: 输入的值是否合法

在输入的时候判断输入是否合法

点击按钮的时候计算出值即可

const validBinary = (str) => {
    for (const ch of str) {
      // 字符串必须是二进制串
        if (ch !== "0" && ch !== "1") {
            return false
        }
    }
    return true
}
const parseBinary = (str) => {
  // 得到二进制数组
    let arr = str.split("").map(Number)
    let res = arr.reduceRight((prev, cur, index) => {
        if (cur === "0") {
            return prev
        } else {
            return prev + Math.pow(2, arr.length - index -1)
        }
    }, 0)
    return res
}

image-20220829234142529

输入其他字符时

image-20220829234207309

\