#javascript #reactjs #react-redux
#javascript #reactjs #реагировать-redux
Вопрос:
Я новичок в react и разрабатываю очень простое приложение с базой данных MySQL. Здесь я отправляю обзоры в БД и возвращаю данные из БД в пользовательский интерфейс. После нажатия кнопки отправки в пользовательском интерфейсе не отображается обновленный список фильмов и просмотров. Кроме того, реквизиты не меняются. Пожалуйста, помогите мне понять, что я здесь сделал неправильно. Кроме того, любые улучшения в коде приветствуются.
App.js
import React, { useState, useEffect, Component } from 'react';
import './App.css';
import { addReview } from './actions/actionReview'
import { bindActionCreators } from 'redux'
import { connect } from 'react-redux'
import ReviewList from './components/reviewListComponent'
import Axios from 'axios'
class App extends Component {
state = {
review: {
movie_name: '',
movie_review: ''
}
}
componentDidMount() {
Axios.get('http://localhost:3001/api/get').then(
(response) => {
this.setState({ ReviewList: response.data })
}
)
}
handleChange = (e) => {
this.setState({
[e.target.id]: e.target.value
})
}
handleSubmit = (e) => {
e.preventDefault();
this.props.addReview(this.state)
}
render() {
const { filmReviews } = this.props;
return (
<div className="App">
<h1>Movie Reviews</h1>
<div className="form">
<label>Movie Name</label>
<input type="text" id="film" onChange={this.handleChange} />
<label>Review</label>
<input type="text" id="review" onChange={this.handleChange} />
<button
onClick={this.handleSubmit}
>Submit
</button>
<h1>Review List</h1>
<div className='Project-list-section'>
{this.state.ReviewList amp;amp; this.state.ReviewList.map(review => {
return (
<ReviewList filmReview={review} key={review.id} />
)
})}
</div>
</div>
</div>
);
}
}
function mapStateToProps(state) {
return {
filmReviews: state.ReviewList
}
}
const matchDispatchToProps = (dispatch) => {
return {
addReview: (review) => dispatch(addReview(review))
}
}
export default connect(mapStateToProps, matchDispatchToProps)(App);
allReviewReducer.js
import React, { useState, useEffect, Component } from 'react';
import Axios from 'axios'
const initState = {}
function allReviewReducer(state = initState, action) {
switch (action.type) {
case 'ADD_REVIEW':
console.log('Review received', action.addReview)
fetchReview(action.addReview)
case 'DISPLAY_ALL_REVIEWS':
console.log('please display all reviews')
default:
return state;
}
return state
}
function fetchReview(review) {
Axios.post("http://localhost:3001/api/insert",
{
movieName: review.film,
movieReview: review.review
}).then(() => {
alert('Successful Insert');
})
}
export default allReviewReducer
rootReducer.js
import { combineReducers } from 'redux'
import allReviewReducer from './allReviewsReducer'
const rootReducer = combineReducers({
allReview : allReviewReducer
})
export default rootReducer
reviewListComponent.js
import React from 'react'
const ReviewList = (filmReviews) => {
return (
<div>
<h3>{filmReviews.filmReview.movie_name} || {filmReviews.filmReview.movie_review}</h3>
</div>
)
}
export default ReviewList
actionReview.js
import React, { useState, useEffect, Component } from 'react';
export const addReview = (review) => {
return (dispatch, getState) => {
dispatch({
type: 'ADD_REVIEW',
addReview: review
})
}
}
export default addReview
Ответ №1:
Откуда в этом фрагменте взяты ваши отзывы?
import React, { useState, useEffect, Component } from 'react';
export const addReview = (review) => {
return (dispatch, getState) => {
dispatch({
type: 'ADD_REVIEW',
addReview: review
})
}
}
export default addReview
Откуда они должны поступать, это, конечно, ваш магазин redux. Похоже, здесь это не так. Вы можете легко получить свои данные из своего хранилища, используя useSelector
предоставленный redux, подробнее об этом читайте здесь .
Кроме того, попробуйте прочитать redux-thunk
и как отправлять асинхронные действия в ваше хранилище redux. Это простое промежуточное программное обеспечение, которое поможет вам это сделать.
Затем проверьте свой магазин redux с помощью инструментов разработки в вашем браузере, чтобы вы всегда могли видеть, в каком состоянии он находится. Инструменты разработки redux позволят вам увидеть, когда было отправлено действие и как оно повлияло на состояние вашего хранилища. Это значительно упрощает проверку правильного состояния вашего хранилища.