react 函数组件案例

函数组件案例(蓝铅笔)

一、思路

  1. 向第三方接口发起请求,获取数据。
  2. 将数据渲染到页面中

二、相关知识点

  • async-await 进行封装函数

  • 通过函数封装组件,内部声明组件,会造成组件重复创建的问题。测试:设置一个定时器,可以发现,每次定时器执行,都在声明新的函数组件,同时,ReactDOM.render()也在重复的渲染新创建的组件。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kd1a3fri-1653999495022)(结果展示图/函数组件案例注意1.jpg)]

  • ReactDOM.render(,document.getElementById(“main”)); 相当于性能创建了一个实例,所以会重新渲染。

  • arr.map();可以循环遍历数组中的元素。

  • 在JSX中绑定事件,想要传递参数时,需要使用匿名函数 如下图

在这里插入图片描述

三、代码示例

1.引入react和babel,并设置相关类型

2.HTML代码

<div id="main"></div>

3.JS 代码

(1).封装一个发送ajax请求的函数

async function ajaxAsync(url) {
      let promise = await fetch(url).then((response) => {
          return response.json();
        });
        return promise;
      }

(2).发送ajax请求,获取到导航的数据,并将导航的数据保存到一个全局变量中。在下面获取数据时发现,有了数据冲突,为了解决冲突的问题,使用了全局变量,如果只发送一次请求,可以不声明全局变量,直接通过调用函数传递参数

ajaxAsync(
        "https://www.lanqb.com/api/course/course-group-list?course_style=1"
      ).then(({ course_style }) => {
        console.log("course_style----", course_style);
        // 获取到数据后 将数据保存在全局变量中
        globalNavDatas = course_style;
       
      });

(3)发送ajax 请求,获取到课程的数据,将页面进行初始化,并且以调用函数的方式传递数据。

async function getCourses(id) {
   let { data: courses } = await ajaxAsync(
      `https://www.lanqb.com/school/professional?status=show&limit=20&page=1&course_style_ids=${id}&weight=desc`
        );
        renderDOM({ type: "course", datas: courses });
      }
       //   进行初始化 调用这个接口,不传递参数
      getCourses("");

(4)声明一个渲染DOM的函数,用来接收请求返回的数据,渲染到页面中。在这个函数中,

  • 包含按钮的点击事件,以id作为参数。
  • 声明导航条函数组件
  • 声明课程组件
  • 声明根组件
function renderDOM(source) {
 //   按钮点击事件:
        function btnClick(id) {
          console.log(id);
          getCourses(id);
        }
        console.log("datas---", source);
// 声明导航条函数组件
        function NavCates() {
          return (
            <div className="nav">
              <button onClick={()=>btnClick("")>全部</button>
              {/* 这样可以循环遍历数据,生成多个 button,通过datas.map()  */}
              {globalNavDatas.map(
                (nav) => (
                  console.log("nav----", nav), 
                  (
                    <button onClick={() => btnClick(nav.id)}>
                      {nav.style_title}
                    </button>
                  )
                )
              )}
            </div>
          );
        }
// 声明课程组件
        function Course(props) {
          return (
            <div className="course">
              <h3>{props.title}</h3>
            </div>
          );
        }
 // 声明根组件
        function Root() {
          return (
            <div className="root">
              <NavCates></NavCates>
              {source &&
                source.datas.map((c) => <Course title={c.title}></Course>)}
            </div>
          );
        }
        ReactDOM.render(<Root></Root>, document.getElementById("main"));
      }

四、结果展示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值