保存 React 组件并稍后加载



我在 react 本机应用程序中有 react 组件,这将像这样返回 Smth:

constructor(){
    ...
    this.Comp1 = <Component1 ..... >
    this.Comp2 = <Component2 ..... >
}
render(){
    let Show = null
    if(X) Show = this.Comp1
    else Show = this.Comp1
    return(
        {X}
        )
    }

我的两个组件内部都有一个API请求,

所以我的问题是当条件发生变化并且这在组件之间切换时,每次组件向该 API 发送请求以获得相同的结果时,

我想知道如何保存他们每次都不会发送请求的构造组件

其中一种方法是处理每个子组件内部的隐藏和显示comp1comp2

因此,您仍将从父组件渲染comp1comp2,但您将向每个组件传递一个 prop,告诉他们是否需要显示或隐藏内部内容,如果显示则渲染正确的组件内容,否则只需渲染空<Text></Text>

这意味着两个子组件都存在于父组件中,并且它们永远不会被删除,但您可以控制哪个子组件应通过父组件显示其自己的内容。

因此,您的数据只会提取一次。


检查 react js 中的工作示例:https://codesandbox.io/s/84p302ryp9
如果您检查了控制台日志,您会发现 comp1 和 comp2 的获取只完成了一次。


还要检查下面的 react native 中的相同示例:

class Parent extends Component {
  constructor(props)
  {
    super(props);
    this.state={
      show1 : true //by default comp1 will show
    }
  }
  toggleChild= ()=>{
    this.setState({
      show1 : !this.state.show1
    });
  }
  render(){
    return (
      <View >
        <Button onPress={this.toggleChild} title="Toggle Child" />
        <Comp1 show={this.state.show1} />
        <Comp2 show={!this.state.show1} />
      </View>
    )
  }
}

比较1:

class Comp1 extends Component
{
  constructor(props) {
    super(props);
    this.state={
      myData : ""
    }
  }
  componentWillMount(){
    console.log("fetching data comp1 once");
    this.setState({
      myData : "comp 1"
    })
  }

  render(){
    return (
      this.props.show ? <Text>Actual implementation of Comp1</Text> : <Text></Text>
    )
  }
}

比较2:

class Comp2 extends Component {
  constructor(props) {
    super(props);
    this.state = {
      myData2: ""
    }
  }
  componentWillMount() {
    console.log("fetching data in comp2 once");
    this.setState({
      myData2: "comp 2"
    });
  }

  render() {
    return (
      this.props.show ? <Text>Actual implementation of Comp2</Text> : <Text></Text>
    )
  }
}

我认为,您应该将所有逻辑移动到主组件(获取和保存数据,因此组件 1 和组件 2 是简单的愚蠢组件。在组件 1 和组件 2 中,您可以检查"组件是否有一些数据?",如果没有任何数据,您可以在父组件中触发对该数据的请求。

完整的工作示例在这里:https://codesandbox.io/s/7m8qvwr760

class Articles extends React.Component {
  componentDidMount() {
    const { fetchData, data } = this.props;
    if (data && data.length) return;
    fetchData && fetchData();
  }
  render() {
    const { data } = this.props;
    return (
      <div>
        {data && data.map((item, key) => <div key={key}>{item.title}</div>)}
      </div>
    )
  }
}
class App extends React.Component{
  constructor(props){
    super(props);
    this.state = {
      news: [],
      articles: [],
      isNews: false
    }
  }
  fetchArticles = () => {
    const self = this;  
    setTimeout( () => {
      console.log('articles requested');
      self.setState({
        articles: [{title: 'article 1'}, {title: 'articles 2'}]
      })
    }, 1000)
  }
  fetchNews = () => {
    const self = this;
    setTimeout(() => {
      console.log('news requested');
      self.setState({
        news: [{ title: 'news 1' }, { title: 'news 2' }]
      })
    }, 1000)
  }
  handleToggle = (e) => {
    e.preventDefault();
    this.setState({
      isNews: !this.state.isNews
    })
  }
  render(){
    const { news, articles, isNews} = this.state;
    return (
      <div>
        <a href="#" onClick={this.handleToggle}>Toggle</a>
        {isNews? (
          <News data={news} fetchData={this.fetchNews} />
        ): (
           <Articles data={articles} fetchData={this.fetchArticles} />
        )}
      </div>
    )
  }
}

相关内容

  • 没有找到相关文章

最新更新