javascript - 如何将按钮值从一个组件移动到另一个组件?
问题描述
我正在尝试制作一个计算器应用程序,其中涉及 3 个主要组件。应用程序标题所在的顶部栏和一个切换主题的开关、一个显示算术运算及其结果的屏幕组件以及一个包含所有可用可点击数字和数学运算的键盘组件。我使用 Chakra UI 库来构建我的应用程序。有没有办法获取键盘组件中按钮的值并将其“发送”到会发生算术的屏幕组件?
import * as React from "react"
import {
ChakraProvider,
Box,
Text,
Flex,
Center,
Spacer,
Container,
VStack,
FormControl,
FormLabel,
Switch,
useColorMode,
useColorModeValue,
Input,
Grid,
GridItem
} from "@chakra-ui/react"
import "@fontsource/spartan/700.css"
import customTheme from "./theme"
import CalculatorButton from "./button-component";
import FunctionalButton from "./function-component";
export default function App(){
return (
<ChakraProvider theme={theme}>
<Box bg={"bisque"} color={"white"} h="100vh">
{/* Main App Container */}
<Box>
<Center>
<VStack>
{/* Top bar */}
{TopBar()}
{/* Result Display */}
{DisplayResult()}
{/* Keys pad */}
{KeypadButtons()}
</VStack>
</Center>
</Box>
</Box>
</ChakraProvider>
);
}
function TopBar() {
return (
<Container p="0">
<Flex align="center" justify="space-between">
<Box>
<Text fontSize="22" fontWeight="bold">calc</Text>
</Box>
<Spacer />
<Box>
<FormControl display="flex" alignItems="center">
<FormLabel htmlFor="theme-switch" mb="0" fontSize="9">
THEME
</FormLabel>
<Switch id="theme-switch" size="sm" />
</FormControl>
</Box>
</Flex>
</Container>
);
}
function DisplayResult() {
interface CalculatorData {
value:number,
prevState:null,
}
const [value,setValue] = useState<CalculatorData | null>(null);
return (
<Box size="lg" mb="2" sx={{ width: "100%" }}>
<Input
placeholder="0"
textAlign="right"
p="10"
bg={darkSaturatedBlue.screenBackgroundColor}
border="none"
fontSize="23"
// value={value}
// onChange={(e)=>setValue(parseInt(e.target.value))}
/>
</Box>
);
}
function KeypadButtons() {
return <Container bg={darkSaturatedBlue.toggleKeybadBackgroundColor} borderRadius="3" p="3">
<Grid templateColumns="repeat(4,1fr)" templateRows="repeat(5,1fr)" gap="2">
<CalculatorButton digit={7} color="white" size="md" bg={darkSaturatedBlue.buttonDigitColor} />
<CalculatorButton digit={8} color="white" size="md" bg={darkSaturatedBlue.buttonDigitColor}/>
<CalculatorButton digit={9} color="white" size="md" bg={darkSaturatedBlue.buttonDigitColor}/>
<FunctionalButton digit={"DEL"} color="white" size="md" boxShadow="md" />
<CalculatorButton digit={4} color="white" size="md" bg={darkSaturatedBlue.buttonDigitColor}/>
<CalculatorButton digit={5} color="white" size="md" bg={darkSaturatedBlue.buttonDigitColor}/>
<CalculatorButton digit={6} color="white" size="md" bg={darkSaturatedBlue.buttonDigitColor}/>
<FunctionalButton digit={"+"} color="white" size="md" boxShadow="md" />
<CalculatorButton digit={1} color="white" size="md" bg={darkSaturatedBlue.buttonDigitColor}/>
<CalculatorButton digit={2} color="white" size="md" bg={darkSaturatedBlue.buttonDigitColor}/>
<CalculatorButton digit={3} color="white" size="md" bg={darkSaturatedBlue.buttonDigitColor}/>
<FunctionalButton digit={"-"} color="white" size="md" boxShadow="md" />
<FunctionalButton digit={"."} color="white" size="md" boxShadow="md" />
<CalculatorButton digit={0} color="white" size="md" bg={darkSaturatedBlue.buttonDigitColor}/>
<FunctionalButton digit={"/"} color="white" size="md" boxShadow="md" />
<FunctionalButton digit={"x"} color="white" size="md" boxShadow="md"/>
<GridItem colSpan={2}>
<FunctionalButton digit={"RESET"} color="teal" size="md" style={buttonStyle} boxShadow="md" />
</GridItem>
<GridItem colSpan={2}>
<FunctionalButton digit={"="} color="red" size="md" style={buttonStyle} boxShadow="md" />
</GridItem>
</Grid>
</Container>;
}
计算器按钮.tsx
import * as React from 'react';
import {Button} from '@chakra-ui/react';
const CalculatorButton: React.FC<{digit:Number,color:string,bg?:string,size:string}> = ({digit,color,bg,size}) => {
return (
<Button colorScheme="White" size={size} m="1" bg={bg} variant="solid">
{digit}
</Button>
);
}
export default CalculatorButton;
函数组件.tsx
import * as React from 'react';
import {Button} from '@chakra-ui/react';
const FunctionalButton : React.FC<{digit:string,color:string,boxShadow:string,size:string,style?:object}> = ({digit,color,boxShadow,size,style}) => {
return (
<Button colorScheme={color} size={size} sx={style} m="1" boxShadow={boxShadow}>
{digit}
</Button>
)
}
export default FunctionalButton;
解决方案
推荐阅读
- knockout.js - Knockoutjs 映射不会将 observables 添加到字符串数组中
- html - 如何提取嵌入跨度的文本?
- r - R中几何形状的计算
- macos - 在 Mac os 中拦截所有系统级音频
- html - 如何将 HTML 登录/注册表单连接到 SQLITE 数据库
- flutter - 如何使用颤振在对话框或警报对话框中创建行
- angular - 使用 ngFor 时 Bootstrap navbar-nav 的问题
- python - 子串置换复杂度
- r - 如何为具有多个/嵌套值的目标列拆分数据框中的行
- service-worker - 无法使用脚本 ('https://*.com/service-worker.js') 为范围 ('https://*.com/') 注册 ServiceWorker:无法访问存储