react使用function和class定义组件的一些区别

使用function定义组件

import React, { useState, useEffect } from "react";
import { useLocation } from "react-router-dom";
import qs from "qs"; //qs用来格式化数据
import { movieDetail } from "../../services/movies";

//推荐使用function定义组件,react16.8以后新增hook可以让function定义的组件具有局部state

export default function Detail() {
  //function定义的组件没有局部的数据,所以使用useState()获取局部数据(局部状态)
  //以下例子第一个参数表示定义的数据,第二个参数表示更改此数据要用到的方法,useState()中的参数表示定义数据的初始值
  //也就是movie={video:{}} 若要定义多个值,多次使用useState就行了
  const [movie, setMovie] = useState({
    video: {},
  });
  const [live, sertLive] = useState({}); //live={}
  //function定义的组件不能使用this.props.location来获取地址栏信息,使用useLocation()获取地址栏信息
  const location = useLocation();
  console.log(location);

  //function定义的组件也没有生命周期的钩子函数,我们使用useEffect来模拟生命周期,
  //参数一表示参数二依赖的内容发生改变之后触发的回调函数,如果参数二为空数组表示只执行一次(初始化执行)
  useEffect(() => {
    const query = qs.parse(location.search, {
      ignoreQueryPrefix: true, //此参数表示过滤掉前缀
    });
    //useEffect中调用异步函数如下所示
    async function fetchData() {
      // You can await here
      const result = await movieDetail(query.id);
      console.log(result);
      setMovie(result.data.data.basic);
      sertLive(result.data.data.live);
    }
    fetchData();
  }, []);
  return (
    <div>
      <img
        style={{ width: "100%", margin: "0 auto", display: "block" }}
        src={live.img}
      ></img>
      <h1>{movie.name}</h1>
      <p>{movie.story}</p>
      <video controls autoPlay src={movie.video.url}></video>
    </div>
  );
}

使用class定义组件

import React, { useState, useEffect, Component} from "react";
import { useLocation } from "react-router-dom";
import qs from "qs"; //qs用来格式化数据
import { movieDetail } from "../../services/movies";

//使用class定义组件中this指向复杂,不推荐使用

export default class Detail extends Component {
  constructor(props) {
    super(props);
    console.log(props);
    this.state = {
      movie: {
        video: {
          url: "",
        },
      },
    };
  }
  async componentDidMount() {
    console.log(this.props.location.search); //url传参
    //qs第二个参数表示过滤掉前缀
    const query = qs.parse(this.props.location.search, {
      ignoreQueryPrefix: true,
    });
    console.log(query);
    const result = await movieDetail(query.id);
    console.log(result);
    this.setState({
      movie: result.data.data.basic,
    });
    document
      .querySelectorAll(".nav ul li")[1]
      .querySelector("a")
      .classList.add("active");
  }
  componentWillUnmount() {
    document
      .querySelectorAll(".nav ul li")[1]
      .querySelector("a")
      .classList.remove("active");
  }
  render() {
    return (
      <div>
        <h1>{this.state.movie.name}</h1>
        <p>{this.state.movie.story}</p>
        <video controls autoPlay src={this.state.movie.video.url}></video>
      </div>
    );
  }
}

 

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
React,可以混合使用Class组件Function组件。通常情况下,Class组件用于较复杂的逻辑和状态管理,而Function组件则用于简单和无状态的展示层组件。 下面是一个示例,展示了如何在同一个父组件混合使用Class组件Function组件: ```jsx import React, { Component } from 'react'; // Class组件 class Counter extends Component { constructor(props) { super(props); this.state = { count: 0 }; } incrementCount = () => { this.setState(prevState => ({ count: prevState.count + 1 })); } render() { return ( <div> <h2>计数器</h2> <p>当前计数:{this.state.count}</p> <button onClick={this.incrementCount}>增加</button> </div> ); } } // Function组件 const Greeting = () => { return ( <div> <h2>欢迎信息</h2> <p>欢迎来到React混合组件示例!</p> </div> ); } // 父组件 const App = () => { return ( <div> <Greeting /> <Counter /> </div> ); } export default App; ``` 在上述代码,我们定义了一个Class组件`Counter`和一个Function组件`Greeting`。`Counter`组件有一个计数器状态,并且有一个增加计数的方法。`Greeting`组件只负责展示欢迎信息。 在父组件`App`,我们将`Greeting`组件和`Counter`组件一起渲染。这样,我们就实现了Class组件Function组件的混合使用。 请注意,在React 16.8版本之后,引入了Hooks API,使得Function组件也可以具有状态和生命周期的特性,因此在新的React项目,建议优先使用Function组件和Hooks。但是,仍然可以在需要的情况下使用Class组件

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值