はじめに
Reactを触り始めたので何度か復讐のために同じようなフォームを何度も作ってみることを目的としています。 ※前回は会員登録フォームを作成したので今回はBMI計算 px-wing.hatenablog.com
今回はBMIの計算だけですが、この情報をローカルストレージに蓄積してグラフを出したい。(今のスキルではできない)
サンプルコード
import React,{useState} from 'react' import {Form, Button} from 'react-bootstrap' import './siginin.css' import { Formik } from 'formik' import * as yup from 'yup' const Bmi = () => { const [bmi, setBmi] = useState({bmi: 0,judge: ''}) const schema = yup.object({ bodyHeight: yup.number().min(1,'身長は0以上の数値を入力して下さい。').required('身長を入力してください。'), bodyWeight: yup.number().min(1,'体重は0以上の数値を入力して下さい。').required('体重を入力してください。'), }); //https://jaredpalmer.com/formik/docs/overview return ( <Formik validationSchema={schema} onSubmit={(values) => { const a = (values.bodyHeight/100) const resultBmi = (values.bodyWeight/(a*a)).toFixed(2) alert(resultBmi) if(resultBmi<18.5){setBmi({bmi: resultBmi,judge: 'Under weight'});} else if(resultBmi<24.9){setBmi({bmi: resultBmi,judge:'Normal weight'});} else if(resultBmi<30){setBmi({bmi: resultBmi,judge:'Overweight'});} else{setBmi({bmi: resultBmi,judge:'Obesity'});} }} initialValues={{ bodyHeight: '', bodyWeight: '' }} > { ({handleSubmit, handleChange, handleBlur, values, errors, touched}) => ( <> <h4>BMI計算</h4> <Form noValidate onSubmit={handleSubmit}> <Form.Group controlId="formGroupName"> <Form.Label>身長</Form.Label> <Form.Control name="bodyHeight" type="number" min="0" step="0.01" placeholder="身長を入力して下さい" value={values.contract_undeliverable_datescontract_undeliverable_dates} onBlur={handleBlur} onChange={handleChange} isInvalid={!!(touched.bodyHeight && errors.bodyHeight)}/> <Form.Control.Feedback type="invalid">{errors.bodyHeight}</Form.Control.Feedback> </Form.Group> <Form.Group controlId="formGroupWeight"> <Form.Label>体重</Form.Label> <Form.Control name="bodyWeight" type="number" min="0" step="0.01" placeholder="体重を入力して下さい" value={values.bodyWeight} onBlur={handleBlur} onChange={handleChange} isInvalid={!!(touched.bodyWeight && errors.bodyWeight)}/> <Form.Control.Feedback type="invalid">{errors.bodyWeight}</Form.Control.Feedback> </Form.Group> <div className='text-center'> <Button variant="primary" type="submit">計算</Button> </div> </Form> BMI: {bmi.bmi}<br /> 診断: {bmi.judge} </> )} </Formik> ) } export default Bmi
完成した画面