How to specify a constructor with a functional component (fat arrow syntax)?

后端 未结 5 781
南笙
南笙 2020-12-15 16:46

Given this component:

import React from \'react\'
import ReactDOM from \'react-dom\'
import PropTypes from \'prop-types\'

const NewGoalInput = props => {         


        
5条回答
  •  没有蜡笔的小新
    2020-12-15 17:24

    Since it's a stateless component it doesn't have the component lifecycle. Therefor you can't specify a constructor.

    You have to extend React.Component to create a stateful component which then will need a constructor and you'll be able to use the state.

    Update Since React 16.8.0 and Hooks got introduced there are more options.

    Hooks are a new feature proposal that lets you use state and other React > features without writing a class. They are released in React as a part of > v16.8.0

    Stateless:

    import React from "react"
    
    const Stateless = ({name}) => (
      
    {`Hi ${name}`}
    );

    Stateful:

    Has access to component lifecycle methods and local state.

    class Stateful extends React.Component {
      constructor(props) {
        super(props);
        this.state = {
          count: 0
        };
      }
    
      componentDidMount() {
        const { count } = this.state;
        document.title = `You've clicked ${count} times.`;
      }
    
      componentDidUpdate() {
        const { count } = this.state;
        document.title = `You've clicked ${count} times.`;
      }
    
      render() {
        const { count } = this.state;
        return (
          

    You've clicked {count} times.

    ); } }

    Using Hooks:

    Able to use State Hook and Effect Hook.

    If you’re familiar with React class lifecycle methods, you can think of useEffect Hook as componentDidMount, componentDidUpdate, and componentWillUnmount combined.

    import React, { useState, useEffect } from "react";
    
    const UsingHooks = () => {
      const [count, setCount] = useState(0);
    
      // Similar to componentDidMount and componentDidUpdate:
      useEffect(() => {
        // Update the document title using the browser API
        document.title = `You've clicked ${count} times.`;
      });
    
      return (
        // <> is a short syntax for  and can be used instead of a wrapping div
        <>
          

    You've clicked {count} times.

    ); }

提交回复
热议问题