反应全局组件

Sta*_*rks 6 javascript components reactjs create-react-app

我来自 vue.js 背景,我最近才开始研究 React。

我有一个组件:PageContent.jsx,我希望使用它而不必经常导入它以便能够在渲染函数 (JSX) 中使用它。

在 vue 中,可以使用以下方法对组件进行全球化:

Vue.component(componentName, componentObject)
Run Code Online (Sandbox Code Playgroud)

反应中有没有类似的东西?

Cha*_*nda 4

嗯,React 中没有任何类型的“全局”组件。每个组件都必须作为 prop 导入或传递。如果您想避免向每个文件添加导入,您有几个选择:

1) 创建一个高阶组件来渲染PageContent和包装组件。

import PageContent from './PageContent';

const withPageContent = WrappedComponent => {
  return class extends React.Component {
    render () {
      return (
        <PageContent>
          <WrappedComponent />
        </PageContent>
      )
    }
  }
};

export default withPageContent;

// Usage

import withPageContent from './withPageContent';

class MyComponent extends React.Component {
  render () {
    return (
      <div>
        I'm wrapped in PageContent!
      </div>
    )
  }
}

export default withPageContent(MyComponent);
Run Code Online (Sandbox Code Playgroud)

2)PageContent作为 prop 传递给组件:

import PageContent from './PageContent';

export default class App extends React.Component {
  render() {
    return (
      <React.Fragment>
        <Child1 content={PageContent} />
        <Child2 content={PageContent} />
      </React.Fragment>
    )
  }
}

// Usage

export default class Child1 extends React.Component {
  render () {
    const PageContent = this.props.content;
    return (
      <PageContent>
        I'm wrapped in PageContent!
      </PageContent>
    )
  }
}

export default class Child2 extends React.Component {
  render () {
    const PageContent = this.props.content;
    return (
      <PageContent>
        I'm wrapped in PageContent!
      </PageContent>
    )
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 感谢您提供的示例,尽管我确实在寻找一些东西来减少每个组件所需的导入量。如果我想与 React 一起工作,我似乎必须忍受这一点 (2认同)
  • 是的,您仍然需要导入一些东西,但是您可以采取一些技巧来使其更轻松。您可以使用 [webpack resolve](https://webpack.js.org/configuration/resolve/) 使导入路径更小并删除文件扩展名。您还可以创建导出多个组件的单个文件,然后可以在一行中导入多个组件,如下所示:`import { Button, Input, Icon } from 'utils/inputs';` (2认同)