【react 全家桶】组合组件

news/2024/7/15 17:34:14 标签: react.js, javascript, 前端, 前端框架

本人大二学生一枚,热爱前端,欢迎来交流学习哦,一起来学习吧。
<专栏推荐>
🔥:js专栏

🔥:vue专栏

🔥:react专栏

文章目录

  • 09 【组合组件】
    • 1.包含关系
    • 2.特例关系问题

09 【组合组件】

1.包含关系

有些组件无法提前知晓它们子组件的具体内容。在 Sidebar(侧边栏)和 Dialog(对话框)等展现通用容器(box)的组件中特别容易遇到这种情况。

我们建议这些组件使用一个特殊的 children prop 来将他们的子组件传递到渲染结果中:

组件标签里面包含的子元素会通过 props.children 传递进来。

function One(props) {
 return (
    <div>{props.children}</div>
    //特殊的children props
  );
}

function Two(props) {
  return (
  //这使别的组件可以通过JSX嵌套,来将任意组件作为子组件来传递给他们
  <One>
      <div>Hello</div>
      <div>World</div>
  </One>
);
}

image-20221025135313079

2.特例关系问题

有些时候,我们会把一些组件看作是其他组件的特殊实例,比如 WelcomeDialog 可以说是 Dialog 的特殊实例。

在 React 中,我们也可以通过组合来实现这一点。“特殊”组件可以通过 props 定制并渲染“一般”组件:

.FancyBorder {
  padding: 10px 10px;
  border: 10px solid;
}

.FancyBorder-blue {
  border-color: blue;
}

.Dialog-title {
  margin: 0;
  font-family: sans-serif;
}

.Dialog-message {
  font-size: larger;
}
function Dialog(props) {
  return (
    <FancyBorder color="blue">
      <h1 className="Dialog-title">
        {props.title}
      </h1>
      <p className="Dialog-message">
        {props.message}
      </p>
    </FancyBorder>
  );
}

function WelcomeDialog() {
  return (
    <Dialog
      title="Welcome"
      message="Thank you for visiting our spacecraft!" />
  );
}

在 CodePen 上尝试

组合也同样适用于以 class 形式定义的组件。

function Dialog(props) {
  return (
    <FancyBorder color="blue">
      <h1 className="Dialog-title">
        {props.title}
      </h1>
      <p className="Dialog-message">
        {props.message}
      </p>
      {props.children}
    </FancyBorder>
  );
}

class SignUpDialog extends React.Component {
  constructor(props) {
    super(props);
    this.handleChange = this.handleChange.bind(this);
    this.handleSignUp = this.handleSignUp.bind(this);
    this.state = {login: ''};
  }

  render() {
    return (
      <Dialog title="Mars Exploration Program"
              message="How should we refer to you?">
        <input value={this.state.login}
               onChange={this.handleChange} />
        <button onClick={this.handleSignUp}>
          Sign Me Up!
        </button>
      </Dialog>
    );
  }

  handleChange(e) {
    this.setState({login: e.target.value});
  }

  handleSignUp() {
    alert(`Welcome aboard, ${this.state.login}!`);
  }
}

在 CodePen 上尝试

image-20221025135929891


http://www.niftyadmin.cn/n/226381.html

相关文章

WPFPasswordBox绑定问题

PassWordBox的Password属性为什么不能绑定 Introduction WPF中的PassWordBox是用于输入密码的控件&#xff0c;它的Password属性是用于获取或设置PassWordBox中的密码。但是&#xff0c;有很多开发者在使用WPF的时候发现&#xff0c;无法通过绑定的方式来设置或获取Password属…

Linux 提权学习

提权的目的是获取 root 权限 root 权限可获取 shadow 文件中的密码 Hash&#xff0c;若内网环境中存在「账户/密码复用」的情况&#xff0c;可用于横向扩展 暴力破解 suid 提权 内核漏洞提权 定时任务提权 sudo 提权 第三方服务提权&#xff08;docker、mysql、redis、NFS提权…

TGP 模板基础知识--04可变参数模板

可变参数模板 允许模板定义中包含0至任意多个模板参数 可变参函数模板 #include <iostream> // 可变参函数模板, // ...表示参数包&#xff0c;T可变参类型&#xff0c; // args&#xff1a;称为一包参数&#xff08;0~多个&#xff09;&#xff0c;每个参数的类型可以…

K-计算面积

链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 题目描述 小w给你三种图形&#xff0c;可能是平行四边形&#xff0c;三角形&#xff0c;梯形&#xff0c;对于给定的TTT个图形&#xff0c;你需要依次回答每个图形的面积&#xff0c;保证答案…

printk

printk We used the printk function in earlier chapters with the simplifying assumption that it works like printf. Now its time to introduce some of the differences. 我们在前面的章节中使用了 printk 函数&#xff0c;并假设它像 printf 一样工作。 现在是时候介绍…

typescript笔记(3)类

类 对于传统的 JavaScript 程序我们会使用函数和基于原型的继承来创建可重用的组件&#xff0c;但对于熟悉使用面向对象方式的程序员使用这些语法就有些棘手&#xff0c;因为他们用的是基于类的继承并且对象是由类构建出来的。 从 ECMAScript 2015&#xff0c;也就是 ES6 开始…

Typora设置修改字体颜色快捷键

目录 1.typora如何设置修改字体颜色快捷键 2. AutoHotKey软件安装 3.typora关于AutoHotKey的具体操作 1.typora如何设置修改字体颜色快捷键 typora本身是不能直接修改字体颜色的&#xff0c;不过若是想修改还是可以用一些代码去改变的&#xff0c;但是每次都修改一次实在麻烦…

使用git log统计代码行数

1.背景 在软件开发过程中&#xff0c;代码行数是一个非常重要的指标&#xff0c;可以用来衡量代码的质量和开发效率。Git是一个流行的版本控制系统&#xff0c;它可以记录和跟踪代码的修改历史。通过使用Git&#xff0c;我们可以很容易地统计代码行数。下面是一些常用的Git命令…