Сброс состояния компонента

157
01 июня 2019, 21:50

Решаю задачу по написанию дипломного проекта. Недавно костылями и всеми правдами, неправдами пришел к такому коду.

import React from 'react' 
import ReactDOM from 'react-dom' 
import Registration from './components/Registration' 
import Course from './components/Course' 
import Theme from './components/Theme' 
import Lesson from './components/Lesson' 
import Qst from './components/Qst' 
import Test from './components/Test' 
import ShowLesson from './components/ShowLesson' 
import ShowQuest from './components/ShowQuest' 
import TestAnswer from './components/TestAnswer' 
import QstAnswer from './components/QstAnswer' 
import Delete from './components/Delete' 
import {Router, Route, Link} from 'react-router-dom' 
import createBrowserHistory from "history/createBrowserHistory" 
import './preload.css' 
 
 
 
const customHistory = createBrowserHistory(); 
const btns = ( 
	<div className="btn-toolbar" role="toolbar" aria-label="Toolbar with button groups"> 
		<div className="btn-group btn-group-lg" role="group" aria-label="First group"> 
			<Link to="/admin/add" className="course btn btn-secondary">ADD</Link> 
			<Link to="/admin/delete" className="qst btn btn-secondary">DELETE</Link> 
			<Link to="/admin/showlesson" className="map btn btn-secondary">SHOW LESSON</Link> 
			<Link to="/admin/showqst" className="lesson btn btn-secondary">SHOW QUEST</Link> 
		</div> 
	</div>); 
let header = new Headers({ 
	'Content-Type': 'application/json', 
	'Accept': 'application/json' 
})	 
 
let myInit = { method: 'GET', 
	   mode: 'cors', 
	   header: header, 
	} 
const endpoint = 'http://localhost:8080/admin/start'; 
 
ReactDOM.render(<div id="preloader"> 
					<div id="loader"></div> 
				</div>,  
				document.getElementById('root')); 
 
function getData () { 
	fetch(endpoint, myInit) 
		.then(res => res.json()) 
		 
		.then((res) => { 
			console.log(`Request to db`) 
			let WrapperAdd = () => { 
				const add = ( 
					<div className='container'> 
						{btns} 
						<br></br> 
						<div className='mess'></div> 
						<Course /> 
						<Theme course={res.course} /> 
						<Lesson course={res.course} data={res.ltheme}/> 
						<Qst course={res.course} data={res.ltheme} /> 
						<Test data={res.ltheme} /> 
						<QstAnswer qst={res.qst} /> 
						<TestAnswer test={res.test} /> 
					</div> 
				) 
				return (add) 
			} 
			let NavBar = () => { 
				const nav = ( 
					<div className='container'> 
						{btns} 
						<br></br> 
					</div> 
				) 
				return (nav) 
			} 
			let DeleteWrapper = () => { 
				const del = ( 
					<div className='container'> 
						{btns} 
						<br></br> 
						<div className='mess'></div> 
						<Delete data={res} /> 
					</div> 
				) 
				return (del) 
			} 
			let ShowLessonWrapper = () => { 
				const sl = ( 
					<div className='container'> 
						{btns} 
						<br></br> 
						<div className='mess'></div> 
						<ShowLesson data={res.ltheme} /> 
					</div> 
				) 
				return (sl) 
			} 
			let ShowQstWrapper = () => { 
				const sqst = ( 
					<div className='container'> 
						{btns} 
						<br></br> 
						<div className='mess'></div> 
						<ShowQuest qst={res.qst} test={res.test} /> 
					</div> 
				) 
				return (sqst) 
			} 
			 
			ReactDOM.render(<Router history={customHistory}> 
				<div> 
					<Route path="/admin/showlesson" component={ShowLessonWrapper} /> 
					<Route path="/admin/showqst" component={ShowQstWrapper} /> 
					<Route path="/admin/delete" component={DeleteWrapper} /> 
					<Route exact path="/admin" component={NavBar} /> 
					<Route exact path="/" component={Registration} /> 
					<Route path="/admin/Add" component={WrapperAdd} /> 
				</div> 
			</Router>, document.getElementById('root')); 
		}) 
	 
} 
getData() 
setInterval(getData, 7000) 
 
 
export default getData;

Приложение будет интерактивными курсами. У приложения есть админка, в которой реализован функционал добавления удаления и просмотра существующих данных. Чтобы данные обновлялись при добавлении, я использовал setInterval Таким образом решил проблему, однако в последствии оказалось что есть и баги. Баг заключается в том что есть компоненты отображающие скажем лекции введенные в базу, однако из-за setInterval, открытая лекция через 7 секунд закрывается.

Код компонента для отображения лекции

import React, {Component} from 'react' 
import 'bootstrap/dist/css/bootstrap.min.css' 
let $ = require("jquery") 
 
let header = new Headers({ 
	'Accept': 'application/json, text/plain, */*', 
	'Content-Type': 'text/javascript' 
}); 
 
class ShowLesson extends Component { 
	render () { 
		const ltheme = this.props.data.map((el) => { 
			let c = el.lcourse 
			let t = el.ltheme 
			return (`${c} -- ${t}`) 
		}) 
		const courseTag = ltheme.map((el, i) => { 
			return (<option key={`lts ${i}`} value={this.props.data[i].ltheme}>{el}</option>) 
		}) 
 
		function Req () { 
			let lesson = $('#showLessons').val() 
			let body = [lesson] 
			let endpoint = 'http://localhost:8080/admin/showlesson' 
				let myInit = { method: 'POST', 
					   mode: 'cors', 
					   header: {header}, 
					   body: body 
					}; 
			fetch(endpoint, myInit) 
				.then(res => res.json()) 
				.then((res) => { 
					if (res.statusEror) { 
						$('.mess').text(res.message) 
						$('.mess').removeClass('success').addClass('err') 
						setTimeout(()=>{ 
							$('.mess').removeClass('err'); 
							$('.mess').text(''); 
						}, 2000) 
					} else { 
						$(".showAria").show() 
						$(".showAria").text(res[0]) 
					} 
				}) 
		} 
		return ( 
				<div className={'container'}> 
					<form action="" id="themeform" noValidate> 
						<div className="input-group mb-3"> 
							<select required className="form-control" id="showLessons"> 
							{courseTag} 
							</select> 
							<div className="input-group-append"> 
								<button onClick={Req} className="btn btn-outline-secondary" type="button" id="addTheme">Show Lesson</button> 
							</div> 
						</div> 
					</form> 
					<div className='showAria'></div> 
				</div> 
				 
		) 
	} 
} 
export default ShowLesson;
не могу решить это ибо не умею пользоваться Redux и потому передаю свойства иерархически. Чтобы обновлять поля и отслеживать изменения в бд вижу только два выхода. Метод задания интервалов или же каким-то образом вызова функции родительского компонента из дочерних. Помогите разобраться.

Answer 1

Решил задачу очень просто. Хоть мой код и набор костылей, но я хочу уточнить что это мой первый опыт работы с React и Rest API. Приложение можно рефакторить и переделывать до бесконечности, но это дипломный проект, а защита уже скоро, потому я искал скорее костыль чем нормальное решение.

В React иерархия идет каскадом (от родителя к потомку) и если запустить функцию родителя в потомке, то ничего хорошего не получится, однако я создал функцию "посредника", которая и стала связью между дочерним и родительским компонентом.

import getData from '../index' 
 
function Refresh () { 
	getData() 
} 
 
export default Refresh

READ ALSO
Преобразование div в изображение и его печать

Преобразование div в изображение и его печать

Хочу распечатать содержимое div со стилями и тп

163
Ошибка при попытке выполнить map в React

Ошибка при попытке выполнить map в React

Мне нужно получить с интернета данные, с этим я разобрался - получаю, и сразу же добавляю их в состояние компонента

147
Как найти точку на расстоянии d от прямой?

Как найти точку на расстоянии d от прямой?

Есть ломаная (задана массивом точек) и нужно найти ломаную, огибающую исходную, наверное более понятно будет на рисунке (синяя - та, которую...

156
Слайдер с бесконечной прокруткой

Слайдер с бесконечной прокруткой

Как сделать слайдер с бесконечной прокруткой, где при нажатии на правую стрелку, например, первый блок за пределами страницы перемещается...

142