我正在努力了解React&Redux,
我正在从我编写的api中获取一些数据,并试图将这些数据渲染到我的组件之一中。返回的数据是一个简单的JSON对象,看起来像这样
{
"brief": "No brief given",
"tasks": [
{
"_id": "5c74ffc257a059094cf8f3c2",
"task": "XXX Task 7",
"project": "5c7458abd2fa91567f4e4f03",
"date_created": "2019-02-26T08:58:42.260Z",
"__v": 0
}
],
"_id": "5c7458abd2fa91567f4e4f03",
"owner": {
"_id": "5c5af553eea087426cd5f9b9",
"name": "Test test",
"email": "test@test.com",
"avatar": "placeholder.jpg",
"password": "$2a$10$dsGdQZ4APnmAVjbII4vX4u7bCEm0vjxGtHAJ8LijrcBBNTHSn9d5i",
"created_at": "2019-02-06T14:55:15.321Z",
"__v": 0
},
"name": "XXX Project 1",
"status": "Pending",
"slug": "XXX-project-1",
"created_at": "2019-02-25T21:05:47.643Z",
"__v": 0
}
我通过componentDidMount()
函数在我的组件中的操作来检索这些数据,
import React, { Component } from "react";
import PropTypes from "prop-types";
import { withRouter } from "react-router-dom";
import { connect } from "react-redux";
import { getProject } from "../../actions/projectActions";
import Dropdown from "react-dropdown";
import Avatar from "../profile/Avatar";
import ProjectPlaceholder from "../../img/new-project.svg";
import "react-dropdown/style.css";
import "../../css/project.scss";
class Project extends Component {
constructor() {
super();
}
componentDidMount() {
const { id } = this.props.match.params;
this.props.dispatch(getProject(id));
}
render() {
console.log(this.props.project.name)
}
Project.propTypes = {};
const mapStateToProps = state => ({
project: state.project.project,
errors: state.errors
});
export default connect(mapStateToProps)(Project);
这是我的动作
import axios from "axios";
import { GET_PROJECT, GET_ERRORS } from "./types";
// Set logged in user
export const getProject = slug => dispatch => {
axios
.get(`/api/projects/${slug}`)
.then(res => {
console.log(res);
dispatch({
type: GET_PROJECT,
payload: res.data
});
})
.catch(err =>
dispatch({
type: GET_ERRORS,
payload: err.response.data
})
);
};
这是我的减速器,
import { GET_PROJECT } from "../actions/types";
const initialState = {};
export default function(state = initialState, action) {
switch (action.type) {
case GET_PROJECT:
return {
...state,
project: action.payload
};
default:
return state;
}
}
所以1)我无法工作,为什么在mapToProps函数中,当所有返回的都是JSON对象时,我需要使用state.project.project; 2)为什么在我的渲染方法中console.log记录未定义?
有人可以帮我吗?
答案 0 :(得分:1)
1。。我无法工作,为什么在mapStateToProps函数中,当所有返回的都是JSON对象时,我需要使用state.project.project。
您始终需要使用 2。。为什么在我的渲染方法中console.log记录未定义。 这是因为您在化简版中的 $description = $request->get('description');
if (!empty($description)){
$description_query = Transcationhistorique::where([
['sender_id', '=', $user_id],
['description', 'LIKE', "%{$description}%"]
])
->orWhere('receiver_id', $user_id)->get();
}else{
$description_query = "" ;
}
访问它,因为 state 是由%let oldValue = %sysfunc(getoption(linesize));
注入的,而state.project.project
是您的数据切片名称< / strong>,因此您需要指定要从中获取数据的数据切片,因为您在商店中使用过 combineReducers 。>
connect
是{},并且您正在project
中使用 async 调用来填充它,当render()得到它是< strong>未定义
答案 1 :(得分:0)
假设res.data
包含您在问题中指定的json对象,并将reducer属性命名为project
,则它应包含project
属性,即代码应该工作正常。您可以尝试在化简器/操作中记录有效负载,以检查api是否正确发送了数据。您还可以将项目的初始值设置为{}
(空对象),以免在初始渲染时将state.project.project
设置为undefined
。请检查其是否正确设置。
您还可以检查控制台中是否有任何错误,还可以使用redux-logger
中间件记录所有调度的操作-这将使您了解redux内部正在发生的事情。