Reactjs 在React组件中是否被视为反模式解决承诺?

Reactjs 在React组件中是否被视为反模式解决承诺?,reactjs,redux,Reactjs,Redux,在应用程序的许多地方,我们确实调用了一个/searchapi,您可以从结果中选择id,然后结果将被丢弃,因为结果是暂时使用的,这让我觉得不值得保存它们,甚至不值得分派操作(设置isLoading标志除外)。但这将迫使我解决react组件中的承诺,这被认为是坏做法还是反模式 例如: 是的,这是React中的反模式。有可能在卸载组件后执行this.setState({results:res.results}) 最好的方法是将状态(搜索挂起/搜索已解决)移出react组件。您可以利用redux+red

在应用程序的许多地方,我们确实调用了一个
/search
api,您可以从结果中选择id,然后结果将被丢弃,因为结果是暂时使用的,这让我觉得不值得保存它们,甚至不值得分派操作(设置isLoading标志除外)。但这将迫使我解决react组件中的承诺,这被认为是坏做法还是反模式

例如:


是的,这是React中的反模式。有可能在卸载组件后执行
this.setState({results:res.results})

最好的方法是将状态(搜索挂起/搜索已解决)移出react组件。您可以利用
redux
+
redux-thunk
mobx
flux
来帮助您。对于简单的情况,您可以构建一个可撤销的承诺

const makeCancelable = (promise) => {
  let hasCanceled_ = false;

  const wrappedPromise = new Promise((resolve, reject) => {
    promise.then(
      val => hasCanceled_ ? reject({isCanceled: true}) : resolve(val),
      error => hasCanceled_ ? reject({isCanceled: true}) : reject(error)
    );
  });

  return {
    promise: wrappedPromise,
    cancel() {
      hasCanceled_ = true;
    },
  };
};

class MyComponent extends Component {
  componentDidMount() {
    this.cancellableSearch = makeCancelable(this.props.doSearch());
    this.cancellableSearch.then((res) => {
      this.setState({ results: res.results });
    }).catch((reason) => {
      if (!isCanceled.isCanceled) {
        console.error('some error occurs', reason);
      }
    })
  }

  componentWillUnmount() {
    this.cancellableSearch.cancel();
  }

  // ...
}

可取消承诺代码从此处复制:

是的,它是React中的反模式。有可能在卸载组件后执行
this.setState({results:res.results})

最好的方法是将状态(搜索挂起/搜索已解决)移出react组件。您可以利用
redux
+
redux-thunk
mobx
flux
来帮助您。对于简单的情况,您可以构建一个可撤销的承诺

const makeCancelable = (promise) => {
  let hasCanceled_ = false;

  const wrappedPromise = new Promise((resolve, reject) => {
    promise.then(
      val => hasCanceled_ ? reject({isCanceled: true}) : resolve(val),
      error => hasCanceled_ ? reject({isCanceled: true}) : reject(error)
    );
  });

  return {
    promise: wrappedPromise,
    cancel() {
      hasCanceled_ = true;
    },
  };
};

class MyComponent extends Component {
  componentDidMount() {
    this.cancellableSearch = makeCancelable(this.props.doSearch());
    this.cancellableSearch.then((res) => {
      this.setState({ results: res.results });
    }).catch((reason) => {
      if (!isCanceled.isCanceled) {
        console.error('some error occurs', reason);
      }
    })
  }

  componentWillUnmount() {
    this.cancellableSearch.cancel();
  }

  // ...
}

可取消承诺代码从这里复制:

是的,这是ReactJS中已知的反模式,因为您无法保证承诺解析时组件仍然存在。从技术上讲,您可以使用this.isMounted进行检查,但这也被认为是一种反模式

问题是,ReactJS并不是真正设计成一个完整的应用程序框架——当它实际上只是一个V时,你有点把MVC推入其中。为了最有效,React应该与其他库(Redux非常流行)结合使用,它可以存储应用程序数据,然后React可以为你展示它。最好将React看作一个库,它将内部UI状态转换为实际的UI。这不利于管理国家


请参阅。

是的,这是ReactJS中已知的反模式,因为您无法保证在承诺解析时组件仍然存在。从技术上讲,您可以使用this.isMounted进行检查,但这也被认为是一种反模式

问题是,ReactJS并不是真正设计成一个完整的应用程序框架——当它实际上只是一个V时,你有点把MVC推入其中。为了最有效,React应该与其他库(Redux非常流行)结合使用,它可以存储应用程序数据,然后React可以为你展示它。最好将React看作一个库,它将内部UI状态转换为实际的UI。这不利于管理国家


请参阅。

我确实在项目中使用了redux。存储的问题是,现在对于我调用搜索api的每个地方,我都必须将结果保存在存储的不同部分,并且感觉它是多余的,因为一旦你选择了id,你就不再需要结果了,我确实在我们的项目中使用了redux。存储的问题是,现在对于我调用搜索api的每个地方,我都必须将结果保存在存储的不同部分,并且感觉它是多余的,因为一旦你选择了id,你就不再需要结果了。是的,我知道react是用于查看的,这就是我问这个问题的原因。我的问题出现是因为我觉得,获取,保存在商店里,一旦用户选择了id,我将不得不再次清空商店的那部分,因为它是暂时的,也许有其他方法可以做到。是的,确切地说,我知道react是为了查看,这就是我问这个问题的原因。我的问题出现是因为我觉得,获取,保存在存储中,一旦用户选择了id,我将不得不再次清空存储的那部分,因为这是暂时的,也许还有其他方法可以做到。