反应全局组件

时间:2018-06-22 20:46:31

标签: javascript reactjs components create-react-app

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

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

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

Vue.component(componentName, componentObject)

有什么类似的反应吗?

2 个答案:

答案 0 :(得分:3)

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

1)创建一个Higher Order Component,以呈现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);

2)将PageContent作为道具传递给组件:

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>
    )
  }
}

答案 1 :(得分:0)

我非常同意Chase的回答。 如果您需要另一种方法,您可以使用 context api。您可以在 App 根目录或其他嵌套组件树中声明您想要轻松访问的组件集合。

这是一个带有 useContext 钩子的例子,但钩子不是必须的。结构是标准的 create-react-app 结构。

我们想要全局访问的组件 - src/deep/Header.js

function Header() {
  return (
    <h1>
      I am a global component
    </h1>
  );
}

export default Header;

上下文创建 - src/global-components-context.js

import React from 'react';

const MyContext = React.createContext(null);

export default MyContext;

全局组件的分组 - src/global-components.js

import Header from './deep/Header';

const contextValue = {
  Header,
};

export default contextValue;

应用初始化文件 - src/index.js

import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';
import MyContext from './global-components-context';
import contextValue from './global-component';

ReactDOM.render(
  <MyContext.Provider value={contextValue}>
    <App />
  </MyContext.Provider>,
  document.getElementById('root')
);

使用组件而不导入它 - src/App.js:

import { useContext } from 'react';
import globalComponent from './global-components-context';

function App() {
  const Context = useContext(globalComponent);
  return (
    <div className="App">
      <Context.Header />
    </div>
  );
}

export default App;

我认为这是你可以在 React 中拥有的最全局的组件。请注意,您仍然需要在要使用全局组件的任何位置导入上下文。

另外一个免责声明,全局组件很难测试,而且经常被推理。我相信这就是为什么现在在 React 中有针对它的标准解决方案。

希望能帮到你