Пример родительской страницы с вкладками
import {Tab, Tabs } from 'react-bootstrap';
import * as Survey from "survey-react";
import "survey-react/survey.css";
import SectionA from './SectionA';
import SectionB from './SectionB';
//Tabs
<Tabs activeKey={this.state.activeTab} onSelect={this.handleSelect}>
<Tab eventKey={1} title="CORE SEC A."><SectionA setClick={click => this.clickChild = click}/></Tab>
<Tab eventKey={2} title="CORE SEC B."><SectionB setClick={click => this.clickChild = click}/></Tab>
...
</Tabs>
//button function
<button onClick={() => this.clickChild()}>Validate All</button>
Пример дочерней страницы
componentDidMount() {
this.props.setClick(this.getValidation);
}
getValidation() {
survey.currentPage.hasErrors();
}
Проблема в том, что после нажатия кнопки Validate All
он вызывает только событие / функцию щелчка второго ребенка. Как я могу вызвать несколько детей, не создавая больше кнопок?
2 ответа
Я бы сделал это с помощью ref
Пример Родителя
class Parent extends React.Component {
constructor(props){
super(props);
this.childA = React.createRef();
this.childB = React.createRef();
//....
}
onClick = () => {
this.childA.current.getValidation();
this.childB.current.getValidation();
//....
};
render(){ return (
<React.Fragment>
....
<button onClick={this.onClick}>Validate Complete</button>
<Tab eventKey={1} title="CORE SEC A."><SectionA ref={this.childA}/></Tab>
<Tab eventKey={2} title="CORE SEC B."><SectionB ref={this.childB}/></Tab>
</React.Fragment>
)}
}
Пример Child (поместите метод на каждую страницу дочернего компонента)
getValidation() {
console.log('Section A validation'); // Section B etc... for other component files
survey.currentPage.hasErrors();
}
Я не в восторге от всего этого дублирования кода - похоже, вам не нужно иметь кучу файлов для обслуживания. Это должно работать для вас, основываясь на том, что я вижу. Если у какого-нибудь гуру React / Javascript есть лучшее решение, мне тоже интересно. Проблема не в том, чтобы иметь кодовую базу, чтобы увидеть, что на самом деле скрыто.
Вы можете присвоить своим компонентам SectionS и Section одно и то же имя класса, а затем вызвать событие click для этого класса в обработчике события click кнопки.
Изменить: добавление примера кода
handleClick() {
const elements = document.getElementsByClassName('clickme');
for(let i=0; i<elements.length; i++) {
elements[i].click();
}
}
//Tabs
<Tabs activeKey={this.state.activeTab} onSelect={this.handleSelect}>
<Tab eventKey={1} title="CORE SEC A."><SectionA className="clickme" setClick={click => this.clickChild = click}/></Tab>
<Tab eventKey={2} title="CORE SEC B."><SectionB className="clickme" setClick={click => this.clickChild = click}/></Tab>
...
</Tabs>
//button function
<button onClick={() => this.handleClick()}>Validate All</button>
Похожие вопросы
Новые вопросы
javascript
По вопросам программирования на ECMAScript (JavaScript/JS) и его различных диалектах/реализациях (кроме ActionScript). Обратите внимание, что JavaScript — это НЕ Java. Включите все теги, относящиеся к вашему вопросу: например, [node.js], [jQuery], [JSON], [ReactJS], [angular], [ember.js], [vue.js], [typescript], [стройный] и т. д.