c# - C#,React,从 JSON 文件中获取数据
问题描述
我是 C# 开发的新手,我正在尝试从 JSON 文件中获取数据以显示在投资组合网站的 React 页面上。我试图按照C# 部分的本教程进行操作,我计划完全重做 React 和 CSS 部分以适应我希望它的外观(已经将反应类组件更改为功能组件),但是当转到 /aboutMe网址,它是空白的。我似乎无法弄清楚如何使获取请求与控制器一起使用,我查了一下并找到了编写控制器的不同方法,这将否定对 JSON 文件的需求,但我想知道是否有建议使用 JSON 文件。
编辑: api/aboutMe URL 加载 API,但来自 API 的数据没有提交到 React 组件。
任何帮助/建议将不胜感激。
我有一个控制器:
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json;
using PortfolioSite.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace PortfolioSite.Controllers
{
[ApiController]
[Route("api/aboutMe")]
public class AboutController
{
[HttpGet]
public AboutMe GetAboutInfo()
{
string jsonText = System.IO.File.ReadAllText("./Data/AboutMe.json");
return JsonConvert.DeserializeObject<AboutMe>(jsonText);
}
}
}
一个模型:
using System;
namespace PortfolioSite.Models
{
public class AboutMe
{
public String Name { get; set; }
public String Title { get; set; }
public String Location { get; set; }
public String Description { get; set; }
}
}
反应组件:
import React, { Component, useState, useEffect } from 'react';
import {
Row, Col, Card, CardImg, CardText, CardBody,
CardTitle, CardSubtitle, Button
} from 'reactstrap';
const AboutMe = () => {
const [hasError, setErrors] = useState(false);
const [name, setName] = useState("");
const [title, setTitle] = useState("");
const [location, setLocation] = useState("");
const [description, setDescription] = useState("");
const fetchData =()=> {
fetch("api/aboutMe")
.then((res) => res.json())
.then(res => setTitle(res.title))
.then(res => setName(res.name))
.then(res => setLocation(res.location))
.then(res => setDescription(res.description))
.catch(err => setErrors(err));
}
useEffect(() => {
fetchData();
},[]);
return (
<div style={{ padding: "15px" }}>
<Row>
<Col md={2}>
<img style={{ height: "100px" }} src='' />
</Col>
<Col md={3} className="center-mobile-text">
<div >
<h5>Name : {name}</h5>
<p> Location: {location}</p>
<p> Title : {title} </p>
</div>
<a style={{ color: "#007bb5" }} target="_blank" href="">
<span className="fa-stack fa-lg">
<i className="fas fa-circle fa-stack-2x"></i>
<i className="fab fa-linkedin-in fa-stack-1x fa-inverse"></i>
</span>
</a>
<a style={{ color: "black" }} target="_blank" href="">
<span className="fa-stack fa-lg">
<i className="fas fa-circle fa-stack-2x"></i>
<i className="fab fa-github fa-stack-1x fa-inverse"></i>
</span>
</a>
<a style={{ color: "red" }} target="_blank" href="">
<span className="fa-stack fa-lg">
<i className="fas fa-circle fa-stack-2x"></i>
<i className="fas fa-envelope fa-stack-1x fa-inverse"></i>
</span>
</a>
</Col>
<Col md={7}>
<p className="textStyle">{description}</p>
</Col>
</Row>
</div>
);
}
export default AboutMe;
以及数据文件夹中的 JSON 文件:
{
"Name": "Test data",
"Title": "Test data job",
"Location": "Test data location",
"Description": ""
}
解决方案
首先,在您的 React 组件中,将您的 useEffect 从:
useEffect(() => {
fetchData();
});
进入 :
useEffect(() => {
fetchData();
}, []);
在第一种情况下,每次更新组件时都会执行 useEffect。因此, fetchData 将永远运行(顺便冻结您的页面)。
在第二种情况下,useEffect 将在组件挂载后执行。所以 fetchDate 只会运行一次。
对于 api,您是否尝试过使用路线: api/aboutMe/GetAboutInfo ?
推荐阅读
- python - 参数错误:参数 3:
: 错误类型 - string - 沿正则表达式拆分字符串,但保持匹配
- ios - “在钥匙串中找不到指定的项目”无效
- python - 如何在pytorch中声明一个标量作为参数?
- java - 尽管使用了 .nextToken(),但字符串标记器在读取文件时未将第二行上的字符串注册为标记
- node.js - 使用 Mongoose deleteOne 功能时,如何向用户反馈“文档不存在”?
- vue.js - 用于显示日期的 Vue 计算属性
- c# - 使用实体框架 C# WebApi 从关系表中获取数据
- layer - 是否有通过将图层与不同背景上的一个对象组合来去除背景的 GIMP 功能?
- android - On scrolled 仅在第一次加载时调用,不再调用