#reactjs #forms #replace #components
#reactjs #формы #заменить #Компоненты
Вопрос:
Мой приведенный ниже код может запускать результат, хорошо связывая форму расчета со страницей результатов. Однако я хочу заменить форму при нажатии кнопки «рассчитать диапазон сохранения», отображая результат на той же странице. Это выглядит как на картинке ниже
]1
Мой код здесь: https://codesandbox.io/s/calculation-form-uxip8?file=/src/components/Calculator.jsx
Calculator.jsx
import React, { Component } from "react";
import "./style.css";
import { Button, Form, Row, Col, Modal } from "react-bootstrap";
class Calculator extends Component {
constructor(props) {
super(props);
this.state = {
squareFootage: ""
};
}
handleSquare = (event) => {
this.setState({ squareFootage: event.target.value });
};
handleSubmit = (event) => {
event.preventDefault();
this.setState({
isOpen: true,
value:
"$"
Math.floor(1.69 * this.state.squareFootage * (10 / 100))
"- $"
Math.floor(1.69 * this.state.squareFootage * (30 / 100))
});
};
closeModal = () => this.setState({ isOpen: false });
render() {
return (
<div className="calculator">
<h1> CALCULATION FORM </h1>
<Form className="form-horizontal">
<Form.Group as={Row} controlId="formHorizontalFootage">
<Form.Label column sm={6}>
Square footage of buildings*
</Form.Label>
<Col sm={6}>
<Form.Control
type="squareFootage"
placeholder="sq ft"
value={this.state.squareFootage}
onChange={this.handleSquare}
required
/>
<div style={{ fontSize: 14, color: "red" }}>
{this.state.squareFootageError}
</div>
<Form.Text className="text-muted">
Please input a number, e.g. 12300
</Form.Text>
</Col>
</Form.Group>
<Button onClick={this.handleSubmit}>
Calculate your Savings Range
</Button>
<Form.Text className="text-muted">* Required Field</Form.Text>
</Form>
<Modal
style={{
position: "absolute",
float: "left",
left: "50%",
top: "50%",
transform: "translate(-50%, -50%)"
}}
show={this.state.isOpen}
value={this.state.value}
onHide={this.closeModal}
>
<Modal.Header closeButton>
<Modal.Title>RESULT</Modal.Title>
</Modal.Header>
<h2>You could save between</h2>
<h1>{this.state.value} Annually</h1>
<Modal.Footer>
<Button variant="primary" onClick={this.closeModal}>
Close
</Button>
</Modal.Footer>
</Modal>
</div>
);
}
}
export default Calculator;
Есть ли у кого-нибудь идея заменить форму информацией о результате на той же странице? Спасибо за вашу помощь!
Комментарии:
1. Это будет просто условное представление, такое как
<div>{ condition ? <div>true</div> : <div>false</div>}</div>
2. куда я могу его поместить? можете ли вы четко объяснить?
Ответ №1:
Вы можете удалить модальный и добавить оператор условия для переключения между содержимым формы и вашим результатом.
Вот как должен выглядеть ваш метод возврата
return (
<div className="calculator">
<h1> CALCULATION FORM </h1>
{
/*Condition*/ !this.state.isOpen ? (
/** if true return form */
<Form className="form-horizontal">
<Form.Group as={Row} controlId="formHorizontalFootage">
<Form.Label column sm={6}>
Square footage of buildings*
</Form.Label>
<Col sm={6}>
<Form.Control
type="squareFootage"
placeholder="sq ft"
value={this.state.squareFootage}
onChange={this.handleSquare}
required
/>
<div style={{ fontSize: 14, color: "red" }}>{this.state.squareFootageError}</div>
<Form.Text className="text-muted">Please input a number, e.g. 12300</Form.Text>
</Col>
</Form.Group>
<Button onClick={this.handleSubmit}>Calculate your Savings Range</Button>
<Form.Text className="text-muted">* Required Field</Form.Text>
</Form>
) : (
/** else return your result div */
<div>
<h2>You could save between</h2>
<h1>{this.state.value} Annually</h1>
</div>
)
}
</div>
);
Вот документация react по условному отображению jsx
https://reactjs.org/docs/conditional-rendering.html
Вы собираетесь использовать оператор условия
<MyComponent>
{conditionCount > 0
? <IfComponent/>
: <ElseComponent/>}// make sure to wrap with the bracket {}
</MyComponent>
Комментарии:
1. не могли бы вы попробовать здесь? ошибка codesandbox.io/s/calculation-form-uxip8?file=/src/components /…
2. Похоже, вы пропустили литерал условия. Здесь исправлены codesandbox.io/s/calculation-form-forked-gcqho ? file=/src/ …
3. Внутри <ElseComponent/> я хочу иметь обратную ссылку на <IfComponent/>, могу ли я поместить <NavLink to=»/»>Снова использовать калькулятор</NavLink> , где <Route точный путь=»/» component={Calculator} /> в App.js ?
4. Вы не можете использовать route link для перехода назад, потому что этот условный рендеринг выполняется в том же компоненте route same. Однако вы можете создать кнопку для переключения this.state.isOpen на false, чтобы скрыть результат и снова показать калькулятор.
5. Не могли бы вы попробовать в песочнице кода, чтобы мне было легко следовать?
Ответ №2:
Я вижу, вы используете isOpen для отображения модального результата. Давайте немного изменим вашу функцию рендеринга на что-то вроде этого
render() {
return (!isOpen ? <YourForm /> : <Result />)
}
В этом случае вы должны изменить isOpen на что-то вроде isSubmitted