区别:1、函数组件是一个纯函数,它接收一个props对象返回一个react元素;而类组件需要去继承React.Component并且创建render函数返回react元素。2、函数组件没有生命周期和状态state,而类组件有。
在本文中我将向你展示函数组件和类组件有什么不同,并且在编码过程中应该如何选择? 定义一个组件最简单的方式就是使用 import React from 'react'
const Welcome = (props) => {
return <h1>welcome, {props.name}</h1>
}
export default Welcome这个函数接收一个 你也可以使用 import React from 'react'
class Welcome extends React.Component {
constructor(props) {
super(props)
}
render() {
return <h1>welcome, {this.props.name}</h1>
}
}
export default Welcome这两个版本是等价的,它们具有相同的输出。那么我们应该去选择哪一种实现方式呢?下面我们来对他们进行比较 1、语法上 两者最明显的不同就是在语法上,函数组件是一个纯函数,它接收一个 我们更深入的了解下,使用 "use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _react = _interopRequireDefault(require("react"));
var Welcome = function Welcome(props) {
return _react["default"].createElement("h1", null, "welcome, ", props.name);
};
var _default = Welcome;
exports["default"] = _default;类组件转译结果: "use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
var _react = _interopRequireDefault(require("react"));
var Welcome =
/*#__PURE__*/
function (_React$Component) {
(0, _inherits2["default"])(Welcome, _React$Component);
function Welcome(props) {
(0, _classCallCheck2["default"])(this, Welcome);
return (0, _possibleConstructorReturn2["default"])(this, (0, _getPrototypeOf2["default"])(Welcome).call(this, props));
}
(0, _createClass2["default"])(Welcome, [{
key: "render",
value: function render() {
return _react["default"].createElement("h1", null, "welcome, ", this.props.name);
}
}]);
return Welcome;
}(_react["default"].Component);
var _default = Welcome;
exports["default"] = _default;可以看到类组件转译成 2、状态管理 因为函数组件是一个纯函数,你不能在组件中使用 如果你需要在你的组件中使用 3、生命周期钩子 你不能在函数组件中使用生命周期钩子,原因和不能使用 因此,如果你想使用生命周期钩子,那么需要使用类组件。 注意:在 4、调用方式 如果 // 你的代码
function SayHi() {
return <p>Hello, React</p>
}
// React内部
const result = SayHi(props) // ? <p>Hello, React</p>如果 // 你的代码
class SayHi extends React.Component {
render() {
return <p>Hello, React</p>
}
}
// React内部
const instance = new SayHi(props) // ? SayHi {}
const result = instance.render() // ? <p>Hello, React</p>可想而知,函数组件重新渲染将重新调用组件方法返回新的 5、获取渲染时的值 这一点是他们最大差异,但又常常被人们忽略。 考虑以下组件: function ProfilePage(props) {
const showMessage = () => {
alert('Followed ' + props.user);
}
const handleClick = () => {
setTimeout(showMessage, 3000);
}
return (
<button onClick={handleClick}>Follow</button>
)
}
我们如何将其编写为类?天真的翻译可能像这样: class ProfilePage extends React.Component {
showMessage() {
alert('Followed ' + this.props.user);
}
handleClick() {
setTimeout(this.showMessage.bind(this), 3000);
}
render() {
return <button onClick={this.handleClick.bind(this)}>Follow</button>
}
}通常认为这两个代码段是等效的。人们经常在这些模式之间自由重构,而没有注意到它们的含义 但是,这两个代码段是完全不同的。好好看看他们。你看到区别了吗? 分别按下面的顺序来操作
你会发现函数组件和类组件是有区别的: 函数组件:按上面所列的三个步骤操作时,当用户在 类组件:按上面所列的三个步骤操作时,当用户在
那么,为什么我们的类示例会这样表现呢? 让我们仔细看一下 showMessage() {
alert('Followed ' + this.props.user);
}在 因此,如果组件在请求重新渲染时, 在 那么我们有没有一种较好的方式可以使用正确的 class ProfilePage extends React.Component {
showMessage(user) {
alert('Followed ' + user);
}
handleClick() {
cosnt {user} = this.props
setTimeout(this.showMessage.bind(this, user), 3000);
}
render() {
return <button onClick={this.handleClick.bind(this)}>Follow</button>
}
}我们使用闭包机制将上一状态的值保存下来待 这种方法虽然解决我们前面所提到的问题,但是这种方法代码会随着 但这么做会破坏类提供的特性。也令人难于记住或执行。另外,在 或许,我们可以在类的构造函数中绑定这些方法: class ProfilePage extends React.Component {
render() {
// 获取props
cosnt props = this.props
// 它们不是类方法
const showMessage = () => {
alert('Followed ' + props.user);
}
const handleClick = () => {
setTimeout(showMessage, 3000)
}
return <button onClick={handleClick}>Follow</button>
}
}这样一来,函数组件和类组件所达到的效果都一样了。在类组件中可以捕获渲染时的 更多编程相关知识,请访问:编程课程!! 以上就是React中函数组件与类组件的区别是什么?的详细内容,更多请关注模板之家(www.mb5.com.cn)其它相关文章! |
