Resact의 해당 구성 요소 외부에 있는 버튼에서 양식을 제출하는 방법?
내 리액션 컴포넌트 중 하나와 외부 컴포넌트 안에 있는 양식을 가지고 있는데, 그걸 리액션이라고 부르는 컴포넌트 안에 있는 버튼에 참조를 전달해서 그 버튼을 이용해서 제출도 할 수 있게 하고 싶다.
좀 더 명확하게 하기 위해 나는 다음과 같은 것을 가지고 있다.
import React, { Component } from "react";
import ReactDOM from "react-dom";
class CustomForm extends Component {
render() {
return (
<form onSubmit={alert('Form submitted!')}>
<button type='submit'>Inside Custom</button>
</form>
);
}
}
function App() {
return (
<div>
<CustomForm />
<button>In Root</button>
</div>
);
}
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);
지금은 '맞춤형 내부' 버튼을 사용하여 양식을 제출할 수 있지만, 루트 구성 요소에 위치한 '뿌리 내' 버튼을 사용하여 양식을 제출할 수 있기를 바란다.버튼에서 사용자 정의 구성요소로 참조를 전달하고 실제로 양식을 제출할 수 있는 방법이 있는가?In Root
버튼 클릭?
정규 HTML 기능(HTML Form Attribute)을 사용하여 이를 달성할 수 있으며, React hacks:
양식에 "id" 속성 추가: id='my-form'
class CustomForm extends Component {
render() {
return (
<form id='my-form' onSubmit={alert('Form submitted!')}>
// Form Inputs go here
</form>
);
}
}
그런 다음 양식 외부에 있는 대상 단추의 "양식" 속성에 동일한 ID를 추가하십시오.
<button form='my-form' type="submit">Outside Button</button>
이제 'Outside Button' 버튼은 마치 양식 안에 있는 것처럼 절대적으로 동일할 것이다.
참고: 이는 IE11에서 지원하지 않는다.
편집: 간단하고 정확한 답변: https://stackoverflow.com/a/53573760/5271656
반응에서 데이터는 아래로 흐르고 동작은 위로 흐른다.따라서 부모에서 단추를 클릭하면 하위 구성 요소에 대해 알리십시오.
이렇게 하면 된다.
import React, { Component } from "react";
import ReactDOM from "react-dom";
class CustomForm extends Component {
handleOnSubmit = e => {
e.preventDefault();
// pass form data
// get it from state
const formData = {};
this.finallySubmit(formData);
};
finallySubmit = formData => {
alert("Form submitted!");
};
componentDidUpdate(prevProps, prevState) {
if (this.props.submitFromOutside) {
// pass form data
// get it from state
const formData = {};
this.finallySubmit();
}
}
render() {
return (
<form onSubmit={this.handleOnSubmit}>
<button type="submit">Inside Custom</button>
</form>
);
}
}
class App extends Component {
constructor(props) {
super(props);
this.state = {
submitFromOutside: false
};
}
submitCustomForm = () => {
this.setState({
submitFromOutside: true
});
};
componentDidMount() {
console.log(this.form);
}
render() {
return (
<div>
<CustomForm submitFromOutside={this.state.submitFromOutside} />
<button onClick={this.submitCustomForm}>In Root</button>
</div>
);
}
}
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);
나에게 이 해결책은 엉터리고 반응하는 방식이 아니라 당신의 사용 사례에 도움이 된다.
여기에서 작업 솔루션을 찾아보십시오.https://codesandbox.io/s/r52xll420m
예를 들어 주에서 적절한 플래그를 설정할 수 있다.rootBtnClicked: false
그리고 클릭을 처리하는 방법App
구성 요소또한 다음에도<CustomForm />
, 소품을 추가한다. rootBtnClicked={this.state.rootBtnClicked}
. "In Root" 버튼을 클릭하면 해당 메서드를 트리거한 다음, 메서드는 다음을 사용하여 상태를 변경한다.setState()
그리고 그 안에CustomForm
구성 요소의render()
메소드, 소품 확인true
. 이 경우 반응의 를 사용하여 수동으로 트리거하십시오.
이 해결책들 중 어느 것도 내게는 통하지 않았지만, 나는 마침내 그것을 하는 것으로 알아냈다.
document.forms[0].submit()
페이지에 양식이 하나밖에 없었기 때문에 0 인덱스로 선택했는데, 양식이 여러 개일 경우 양식 배열에 적용 가능한 색인을 사용해야 할 것 같아.
음, 버튼의 종류는submit
및 속성form
와 같은 가치를 지닌id
제출하고자 하는 양식의
소품으로 제출 기능을 전달하고 원할 때마다 이 방법을 사용할 수 있다.더 복잡한 상황의 경우, 당신은 Redex에 당신의 양식 데이터를 저장하고 버튼을 클릭할 때마다 당신은 Redex에서 데이터를 읽고 제출한다.
다음과 같이 onSubmit 클릭 핸들러를 소품으로 전달할 수 있다.
import React, { Component } from "react";
import ReactDOM from "react-dom";
class CustomForm extends Component {
render() {
return (
<form onSubmit={this.props.handleSubmit}>
<button type='submit'>Inside Custom</button>
</form>
);
}
}
function App() {
handleSubmit = () => {
alert('Form submitted!')
}
return (
<div>
<CustomForm onSubmit={this.handleSubmit} />
<button>In Root</button>
</div>
);
}
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);
양식 제출을 처리하기 위한 소품으로 기능을 전달하면 제출에 대한 비즈니스 논리가 CustomForm 구성요소에 속하지 않기 때문에 CustomForm 요소를 더 재사용할 수 있다.
'Programing' 카테고리의 다른 글
Babel과 TypeScript의 주요 차이점 (0) | 2022.03.20 |
---|---|
MySQLDB라는 모듈 없음 (0) | 2022.03.19 |
새 쿼리를 vue-roouter로 푸시할 때 탐색 중복됨 (0) | 2022.03.19 |
형식 설명으로 대응: 속성 'push'가 유형 'History'에 없음 (0) | 2022.03.19 |
전달 인수에 대한 반응 후크에서 클릭 이벤트에 대한 구문 (0) | 2022.03.19 |