React

关注公众号 jb51net

关闭
首页 > 网络编程 > JavaScript > javascript类库 > React > React传递组件

React中传递组件的三种方式小结

作者:viewer_w

通过传递组件,我们可以将复杂组件内部的一部分 UI 交由外部组件来控制渲染,这也是控制反转(Inversion of Control)的一种体现,在 React 中,我们可以通过三种方式来传递组件,本文就来给大家述说这三种方式,需要的朋友可以参考下

React 中传递组件的三种方式

1. React Element as Prop (即我们通常所说的组合)

这种方式是最常见的一种方式,我们可以将一个 React Element 作为另一个组件的 prop,然后在内部通过props.children来渲染这个 React Element。这种方式的好处是简单易用,但是缺点也很明显,那就是我们不方便对传递进来的 React Element 进行控制,比如我们很难对其 props 进行控制。

假如我们设计一个 Button 组件,Button 内部的 Icon 区域交由外部来控制,那么我们可以这样设计:

// App.js
const App = () => <Button icon={<Icon />}>按钮</Button>;
// Button.js
function Button(props) {
  return (
    <button>
      {props.icon}
      {props.children}
    </button>
  );
}

如果按钮 Icon 的颜色要受到 APP 内的 state 控制,我们很容易实现这样的功能:

// App.js
const App = () => {
  const [color, setColor] = useState("red");
  return (
    <Button
      icon={<Icon color={color} />}
      onClick={() => setColor(color === "red" ? "blue" : "red")}
    >
      按钮
    </Button>
  );
};

可见,这种方式下,传递的组件 Icon 很容易获取外部环境 APP 组件的 state。但是如果 Icon 想获取 Button 组件的内部 state ,那么就不太容易了,因为 Button 组件无法控制 Icon 组件的 props。那么有没有一种方式可以让 Icon 组件获取到 Button 组件的内部 state 呢?答案是肯定的,那就是下面要介绍的第二种方式。

2. Component Function as Prop(传递组件函数)

这种方式,我们传递的是组件的函数,而不是组件本身。这样一来,我们就可以在组件内部控制传递进来的组件的 props 了。我们可以通过这种方式来实现上面的需求:

// App.js
import Icon from "./Icon";
const App = () => {
  return <Button icon={Icon}>按钮</Button>;
};
// Button.js
function Button(props) {
  const Icon = props.icon; // 这里的 Icon 就是一个组件函数,注意Icon的首字母要大写
  const [color, setColor] = useState("red");
  return (
    <button>
      <Icon color={color} />
      {props.children}
    </button>
  );
}

可见,这种组件传递方式,我们可以在 Button 组件内部控制 Icon 组件的 props,这样 Icon 组件就可以获取到 Button 组件的内部 state 了。但是,这种方式也有缺点,那就是 Icon 不能获取外部环境(APP)的 state 了。那么有没有一种方式可以让 Icon 组件既能获取到 Button 组件的内部 state,又能获取到外部环境(APP)的 state 呢?答案是肯定的,那就是下面要介绍的第三种方式。

3. Render Function as Prop(即 render props 渲染属性)

这种方式,我们传递的是一个函数,通过函数的参数,我们可以获取 Button 组件的内部状态。因为函数是在外部环境(APP) 内声明的,所以也很容易获得外部状态。我们可以通过这种方式来实现上面的需求:

// App.js
import Icon from "./Icon";
const App = () => {
  const [size, setSize] = useState(16);
  return (
    <Button renderIcon={(color) => <Icon color={color} size={size} />}>
      按钮
    </Button>
  );
};
// Button.js
function Button(props) {
  const [color, setColor] = useState("red");
  return (
    <button>
      {props.renderIcon(color)}
      {props.children}
    </button>
  );
}

总结

如果传递的组件只需要获取外部环境的 state,那么我们可以使用 React Element as Prop 的方式;

如果传递的组件需要获取宿主组件的 state,那么我们可以使用 Component Function as Prop 的方式;

如果传递的组件需要获取宿主组件的 state,同时也需要获取外部环境的 state,那么我们可以使用 Render Function as Prop 的方式。

以上就是React中传递组件的三种方式小结的详细内容,更多关于React传递组件的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文