react键盘组件

index.jsx

import React, { useState } from 'react'
import './index.css'
const Keyboard = (props) => {
  const [key, setKey] = useState(undefined)
  const handleClick = (value) => {
    props.handleClick(props.value + value)
  }
  const handleDelete = () => {
    if (props.value) {
      props.handleDelete(props.value.slice(0, -1))
    }
  }
  const handleConfirm = () => {
    props.handleConfirm()
  }
  const keyboardList = () => {
    let list = [['1', '2', '3'], ['4', '5', '6'], ['7', '8', '9']]
    return list.map((item, index) => {
      return <div className="keyboard-row" key={index}>
        {
          item.map((e, i) => {
            return <div
              key={i}
              className={["keyboard-key", key === e ? 'active-key' : null].join(' ')}
              onClick={() => handleClick(e)}
              onTouchStart={() => setKey(e)}
              onTouchEnd={() => setKey(undefined)}
            >{e}</div>
          })
        }
      </div>
    })
  }
  return (
    <>
      <div className="number-keyboard">
        {keyboardList()}
        <div className="keyboard-row">
          <div
            className={[
              'keyboard-key',
              'keyboard-delete',
              key === 'backspace' && props.value ? 'active-key' : null,
              props.value ? null : 'disabled'
            ].join(' ')
            }
            onClick={handleDelete}
            onTouchStart={() => setKey('backspace')}
            onTouchEnd={() => setKey(undefined)}
          >
            <span>← backspace</span>
          </div>
          <div
            className={["keyboard-key", key === '0' ? 'active-key' : null].join(' ')}
            onClick={() => handleClick('0')}
            onTouchStart={() => setKey('0')}
            onTouchEnd={() => setKey(undefined)}
          >0</div>
          <div
            className={[
              'keyboard-key',
              'keyboard-confirm',
              key === 'enter' && props.value ? 'active-key' : null,
              props.value ? null : 'disabled'
            ].join(' ')
            }
            onClick={handleConfirm}
            onTouchStart={() => setKey('enter')}
            onTouchEnd={() => setKey(undefined)}
          >
            <span>确定</span>
          </div>
        </div>
      </div>
    </>
  )
}
export default Keyboard

index.css

.number-keyboard {
  display: flex;
  flex-direction: column;
  background-color: #fff;
  border: 1px solid #ccc;
  border-radius: 4px;
  overflow: hidden;
}

.keyboard-row {
  display: flex;
  flex-direction: row;
}

.keyboard-key {
  flex: 1;
  display: flex;
  justify-content: center;
  align-items: center;
  font-size: 16px;
  height: 50px;
  border-right: 1px solid #ccc;
  border-bottom: 1px solid #ccc;
}

.keyboard-key:last-child {
  border-right: none;
}

.keyboard-key.keyboard-delete {
  background-color: #f2f2f2;
}

.keyboard-key.keyboard-confirm {
  background-color: #4caf50;
  color: #fff;
}

.active-key {
  background-color: #ccc !important;
}

.disabled {
  opacity: .5;
}

页面使用

import React, { useState } from 'react'
import Keyboard from '../../components/T-Keyboard';
const Index = () => {
  const [value, setValue] = useState('')
  const handleClick = (value) => {
    setValue(value)
  }
  const handleDelete = (value) => {
    setValue(value)
  }
  const handleConfirm = () => {
    console.log(value);
  }
  return (
    <>
      <Keyboard
        value={value}
        handleClick={handleClick}
        handleDelete={handleDelete}
        handleConfirm={handleConfirm}
      ></Keyboard>
    </>
  )
}
export default Index 

效果如下
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值