我来自vue.js背景,最近才开始研究React。
我有一个组件:PageContent.jsx,我希望使用它而不必不断地导入它以便能够在渲染功能(JSX)中使用它。
可以使用以下方法对组件进行全球化:
Vue.component(componentName, componentObject)
有什么类似的反应吗?
答案 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 中有针对它的标准解决方案。
希望能帮到你