当前位置: 首页 > 面试题库 >

React组件prop更改时如何获取数据?

农英杰
2023-03-14
问题内容

我的TranslationDetail组件在打开时会传递一个ID,并基于此ID在类构造函数中触发外部api调用,以接收到该状态的数据,并将此数据显示在TranslationDetail上。

//Routing:
<Route path="/translation/:id" component={TranslationDetail}/>

//Class:    
class TranslationDetail extends Component {
  constructor(props){
    super(props);

    this.props.fetchTrans(this.props.params.id);
  }

如果我手动输入网址,则一切正常。万一我想使用react-
router例如显示url下面的下一项时,它确实发生了变化,但是api调用未触发,并且数据将保持不变。

<button 
  type="button"
  onClick={() => 
    browserHistory.push(`/translation/${Number(this.props.params.id)+1}`)}>
  Next
</button>

请记住,我是一个初学者。发生这种情况的原因是,我认为构造函数只运行一次,因此不会触发进一步的api调用。

我该如何解决?我是否需要列出道具并在更改时调用函数?如果是,怎么办?


问题答案:

构造函数不是进行API调用的正确位置。

您需要使用生命周期事件:

  • componentDidMount 运行初始提取。
  • componentDidUpdate 进行后续通话。

componentDidUpdate如果您关心的特定道具没有变化,请确保将这些道具与以前的道具进行比较,以免获取。

class TranslationDetail extends Component {    
   componentDidMount() {
     this.fetchTrans();
   }

   componentDidUpdate(prevProps) {
     if (prevProps.params.id !== this.props.params.id) {
       this.fetchTrans();
     }
   }

   fetchTrans() {
     this.props.fetchTrans(this.props.params.id);
   }
}


 类似资料:
  • 我有一个非常简单的功能组件,它从localStorage获取日期并显示它。我有两个按钮来添加或删除日期后的周数,我希望显示新的日期。但是,该组件不会被渲染。 此组件的预期行为是获取时间戳,然后显示该时间戳的月份和年份。加载时,它正确地显示了2021年1月,但是当我在onLefthtml上单击几次时,它并没有呈现组件,尽管我期望它显示2021年12月。计算是正确的,我想我在这里丢失了功能组件渲染的概

  • 我有一些“ChangeMainItem”操作(在我的例子中,它是由外部系统或可能的组件之一调度的)。此操作(例如)仅更新reducer中状态的一个属性(例如)。 我的组件A和B需要对此状态更改做出反应:显示加载指示器、获取其他数据并显示结果。顺序动作可以通过一些异步动作库来完成,但是我应该把调度异步动作放在哪里呢?显然,我不能在组件A和B的reducer中分派异步操作,我也不想将原始操作更改为异步

  • 问题内容: 我现在正在学习反应。这是代码的链接-http: //redux.js.org/docs/basics/ExampleTodoList.html 我在理解这段代码的内容时遇到了一些困难 我最难以理解此片段 {children}在这里是什么意思?它有什么作用? 这是做什么的? 上一行中的节点是什么意思? 问题答案: 当您使用自定义组件时,例如 无论您在标签之间写什么(在上面的示例中为Hel

  • 问题内容: 我正在使用Redux,redux-router和reactjs。 我正在尝试制作一个用于获取路线更改信息的应用程序,因此,我遇到了一些类似的问题: 当有人进入时,我想搜索艺术家,然后渲染信息。问题是,这样做的最佳方法是什么? 我已经找到了有关此问题的答案,使用RxJS或尝试使用中间件来管理请求。现在,我的问题是,这真的必要吗?还是保持体系结构不可知的一种方法?我可以直接从react c

  • 问题内容: 到目前为止,我对如何通过参数将属性从一个组件传递到另一组件的了解程度如下 //开始:我的知识范围 假设存在一些在A.jsx中调用的状态变量。我想将此传递给B.jsx,所以我执行以下操作 然后在B.jsx中,我可以做类似 当被调用时将呈现“今天的主题是天气!” //结束:我的知识范围 现在,我正在阅读带有以下代码片段的react-router教程 topic.jsx: route.jsx

  • 我使用Rails与反应宝石和react-router.js内部资产。我使用webpack为了使用需要 我有我的路线内的应用程序。js: 另外es6。jsx: 当我访问controller_name/index时,默认情况下,它会呈现带有“#hello”链接的“欢迎组件”文本,但单击时,它不会执行任何操作。它仍然在说“欢迎组件” 我做错了什么?