Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么我的componentDidMount()函数在刷新页面时没有被触发,但在第一次登录页面时却可以工作?_Javascript_Reactjs - Fatal编程技术网

Javascript 为什么我的componentDidMount()函数在刷新页面时没有被触发,但在第一次登录页面时却可以工作?

Javascript 为什么我的componentDidMount()函数在刷新页面时没有被触发,但在第一次登录页面时却可以工作?,javascript,reactjs,Javascript,Reactjs,本质上,当我第一次从任何其他页面导航到该页面(/postjob),或者在文本编辑器中按ctrl+s时,似乎会触发componentDidMount()函数,但当我刷新页面时,我认为不会触发该函数。但我不明白为什么,因为我认为每次装载组件时,这个生命周期方法都会触发,而当我刷新时,这会被视为重新装载 以下是我的componentDidMount函数: componentDidMount() { const { user, getAccessTokenSilently, isAuthen

本质上,当我第一次从任何其他页面导航到该页面(/postjob),或者在文本编辑器中按ctrl+s时,似乎会触发componentDidMount()函数,但当我刷新页面时,我认为不会触发该函数。但我不明白为什么,因为我认为每次装载组件时,这个生命周期方法都会触发,而当我刷新时,这会被视为重新装载

以下是我的componentDidMount函数:

  componentDidMount() {
    const { user, getAccessTokenSilently, isAuthenticated } = this.props.auth0;

    const callback = (data) => {
      this.setState({
        userProfile: data
      })
    }

    
    if (isAuthenticated) {
      getUserMetadata(user, getAccessTokenSilently, callback);
    }
  }
下面是我的getUserMetadata函数,它位于另一个JS文件中:

/**
 * Retrieves the full users profile, including all metadata, from auth0
 * @param {Object} user the user object provided by Auth0
 * @param {Function} retrieveToken getAccessTokenSilently function from Auth0
 * @param {Function} callback function to call after userMetadata has been retrieved
 */
const getUserMetadata = (user, retrieveToken, callback) => {

  retrieveToken({
    audience: `https://${domain}/api/v2/`,
    scope: "read:current_user",
  })
  .then(accessToken => {
    const options = {
      method: 'GET',
      url: `https://${domain}/api/v2/users/${user.sub}`,
      headers: {
        Authorization: `Bearer ${accessToken}`,
      }
    }

    axios.request(options)
      .then(res => callback(res.data))
      .catch(err => console.error(err));
  })
  .catch(err => console.error(err));
};
这是我的组件状态:

this.state = {
  title: '',
  description: '',
  skills: [],
  otherSkills: '',
  price: '',
  paymentForms: [],
  userProfile: null,
};

我关心的是userProfile。在第一次渲染时,应该运行getUserMetadata函数,该函数获取令牌,然后使用axios发送GET请求,该请求返回数据,然后将userProfile设置为数据。当我第一次登陆页面时(如上所述),它会正确地执行此操作,但当我刷新时,userProfile为null。我不知道为什么,但我目前的怀疑是关于我的回调函数,它的作用域不正确?

我猜实际上调用了
componentDidMount
,但因为您正在从该页面重新加载应用程序
this.props.auth0
尚未设置/更新,
已验证
仍然为false,因此,不会提取用户数据。你能展示一个更完整的代码示例吗?此组件和父组件渲染它并传递
auth0
prop?在大多数情况下,您只需要实现
componentdiddupdate
生命周期方法,这样当状态更高级别更新时,该组件就可以相应地响应。@Drewrese谢谢,您说得对,因为道具尚未更新,所以isAuthenticated仍然为false,但稍后会变为true。所以我添加了一个componentDidUpdate方法,它可以正常工作。我阅读了文档,但仍在想为什么我必须将我的方法包装成一个条件?componentDidUpdate似乎在道具或状态更改时运行,所以为什么我不能直接调用我的方法呢?如果您指的是
getUserMetadata
函数,请记住
callback
是更新状态,因此,响应状态更新的生命周期方法的任何无条件状态更新都将创建一个无限循环。换句话说,
getUserMetadata
将导致更新状态,这将导致调用
componentDidUpdate
,调用
getUserMetadata
并更新状态并触发
componentDidUpdate
。。。。重复一次,令人作呕。明白了,这是有道理的。谢谢