reactjs - React - 使用新方法时如何更改以旧方式编写的代码?
问题描述
我正在互联网上寻找步骤来重构以前的应用程序以获得新方法,但我没有找到令人满意的答案......
我知道以前在ReactJS中使用 Component
and函数 创建应用程序的方法render()
,但我可以看到它目前有所不同,因为:
npx create-react-app app-name
现在正在生成不同的模板。
例如,以前它是导入的:
import React, {Component} from 'react';
现在只有:
import React from 'react';
我正在寻求有关我应该更改什么的提示或简单建议,以便旧代码可以在不导入 Component
.
通过AJAX(例如loadPerson
)使用函数进行通信的方法是否也发生了变化?
例如这里是一些不工作的例子./src/PersonDetail.js
:
import React from 'react';
import { DetailList } from './DetailList';
import { loadPerson } from './requests';
export class PersonDetail {
constructor(props) {
super(props);
this.state = {person: null};
}
async componentDidMount() {
const {personId} = this.props.match.params;
const person = await loadPerson(personId);
this.setState({person});
}
render() {
const {person} = this.state;
if (!person) {
return null;
}
return (
<div>
<h1 className="title">{person.name}</h1>
<div className="box">{person.description}</div>
<h5 className="title is-5">Details at {person.name}</h5>
<DetailList details={person.details} />
</div>
);
}
}
先感谢您。
解决方案
随着钩子的引入,一些核心概念开始发生变化。在React 16.8之前,我们曾经有一个经验法则来决定一个组件应该基于class
or function
:
如果组件应该保持状态,那么它应该是基于类的。如果它没有状态(无状态),那么它可能是一个功能组件
这曾经是真的,因为没有办法在功能组件中实现有状态逻辑。现在钩子允许您state
在功能组件中实现。
生成的样板create-react-app
不再导入Component
fromreact
导致只有基于类的组件需要extends
fromComponent
并且App
现在是功能组件。
没有任何改变,这只是编写组件的另一种方式。
像以前一样导入:
export class PersonDetail extends React.Component
或者给钩子一个机会,把你的组件变成一个功能组件:
import React, { useState, useEffect } from 'react';
import { DetailList } from './DetailList';
import { loadPerson } from './requests';
const PersonDetail = ({ personID }) => {
const [person, setPerson] = useState(false)
useEffect(() => {
const person = await loadPerson(personId)
setPerson(person)
}, [personID])
return !person ? null : (
<div>
<h1 className="title">{person.name}</h1>
<div className="box">{person.description}</div>
<h5 className="title is-5">Details at {person.name}</h5>
<DetailList details={person.details} />
</div>
)
}
推荐阅读
- c# - 如何使用反射迭代所有属性,包括 IEnumerable 集合?
- c# - C#,关于 while 循环的 SingleLinkedList 问题
- micronaut - micronaut 使用 vue 管理会话
- swift - 在 EnvironmentObject 中使用 @Published 和协议时,我得到 EXC_BAD_ACCESS
- python - Python中嵌套字典中的列表
- javascript - JavaScript 获取两个日期之间的天数
- python - 使用 xpath 从多个来源提取文本
- firebase - AgularFire 结合 2 个流
- php - 后期静态绑定中的对象静态属性
- emacs - Emacs 组织模式;在创建标题时插入 PROPERTIES 抽屉