Reactjs 我应该保留一个全局共享组件,还是每个孩子使用一个? 我的应用程序:

Reactjs 我应该保留一个全局共享组件,还是每个孩子使用一个? 我的应用程序:,reactjs,react-native,Reactjs,React Native,我正在实现一个React本地应用程序,其中使用FlatList全屏显示每个项目。每个文件可能包含/显示若干内容,如文本、图像、GIF。此外,可能会播放一些声音/歌曲。将其视为“增强型”画廊/旋转木马 我的实际实现类似于: export default class App extends React.PureComponent { this.state = { currentIndex: null //currentIndex gets updated when displ

我正在实现一个React本地应用程序,其中使用
FlatList
全屏显示每个项目。每个文件可能包含/显示若干内容,如文本、图像、GIF。此外,可能会播放一些声音/歌曲。将其视为“增强型”画廊/旋转木马

我的实际实现类似于:


export default class App extends React.PureComponent {

    this.state = {
      currentIndex: null //currentIndex gets updated when displayed FlatList item changes
    };

   // Black magic here to update currentIndex

   render() {
      const data = [{image: "...", text: "...", sound: "..."}, {...},...]
      return ( 
          <FlatList
            data = {data}
            renderItem={({ item, index }) => {
              const isDisplayed = this.state.currentIndex === index;
              return <Thing {...item} isDisplayed={isDisplayed} />;
            }}       
            ...
          />
   }
}
我的问题: 我应该为每个
东西保留一个
SoundComponent
,还是应该使用一个由
应用程序管理的全局
SoundComponent
?一方面,我认为
App
应该不知道
data
是如何使用的,另一方面,一个集中的
SoundComponent
似乎更容易同时协调一个声音

请注意,同一时间只能播放一种声音。

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

1) 创建呈现页面内容和包装组件的

import PageContent from './PageContent';

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

export default withPageContent;
从“/PageContent”导入页面内容;
常量withPageContent=WrappedComponent=>{
返回类扩展了React.Component{
渲染(){
返回(
)
}
}
};
导出页面内容的默认值;
//用法

import withPageContent from './withPageContent';

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

export default withPageContent(MyComponent);
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>
    )
  }
}
从“/withPageContent”导入withPageContent;
类MyComponent扩展了React.Component{
渲染(){
返回(
我被页面内容包围了!
)
}
}
使用页面内容导出默认值(MyComponent);
2) 将页面内容作为道具传递给组件:

import PageContent from './PageContent';

export default class App extends React.Component {
  render() {
    return (
      <React.Fragment>
        <Child1 content={PageContent} />
        <Child2 content={PageContent} />
      </React.Fragment>
    )
  }
}
从“/PageContent”导入页面内容;
导出默认类App扩展React.Component{
render(){
返回(
)
}
}
//用法

import withPageContent from './withPageContent';

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

export default withPageContent(MyComponent);
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>
    )
  }
}
导出默认类Child1扩展React.Component{
渲染(){
const PageContent=this.props.content;
返回(
我被页面内容包围了!
)
}
}
导出默认类Child2扩展React.Component{
渲染(){
const PageContent=this.props.content;
返回(
我被页面内容包围了!
)
}
}
React中没有任何类型的“全局”组件。每个组件都必须作为道具导入或传递。如果要避免向每个文件添加导入,您有几个选项:

1) 创建呈现页面内容和包装组件的

import PageContent from './PageContent';

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

export default withPageContent;
从“/PageContent”导入页面内容;
常量withPageContent=WrappedComponent=>{
返回类扩展了React.Component{
渲染(){
返回(
)
}
}
};
导出页面内容的默认值;
//用法

import withPageContent from './withPageContent';

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

export default withPageContent(MyComponent);
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>
    )
  }
}
从“/withPageContent”导入withPageContent;
类MyComponent扩展了React.Component{
渲染(){
返回(
我被页面内容包围了!
)
}
}
使用页面内容导出默认值(MyComponent);
2) 将页面内容作为道具传递给组件:

import PageContent from './PageContent';

export default class App extends React.Component {
  render() {
    return (
      <React.Fragment>
        <Child1 content={PageContent} />
        <Child2 content={PageContent} />
      </React.Fragment>
    )
  }
}
从“/PageContent”导入页面内容;
导出默认类App扩展React.Component{
render(){
返回(
)
}
}
//用法

import withPageContent from './withPageContent';

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

export default withPageContent(MyComponent);
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>
    )
  }
}
导出默认类Child1扩展React.Component{
渲染(){
const PageContent=this.props.content;
返回(
我被页面内容包围了!
)
}
}
导出默认类Child2扩展React.Component{
渲染(){
const PageContent=this.props.content;
返回(
我被页面内容包围了!
)
}
}