当前位置: 首页 > 知识库问答 >
问题:

绑定(这)不工作在ajax成功函数

关飞翔
2023-03-14

在react组件挂载之前,我执行ajax请求以了解用户是否登录。

它应该在响应返回状态代码200时设置状态。
我是否错误地使用了bind(this)

componentWillMount: function(){
  $.ajax({
     url: "/is_signed_in",
     method: "GET",
     dataType: "json"
  }).success(function(response){
    this.setState({ signedIn: response.signed_in, currentUser: $.parseJSON(response.current_user) });
  }.bind(this));
},
componentDidMount: function(){
  console.log(this.state.signedIn);
}

编辑01

R…s.c…s.Constructor {props: Object, context: Object, state: Object, refs: Object, _reactInternalInstance: ReactCompositeComponentWrapper}_reactInternalInstance: ReactCompositeComponentWrapper_context: Object_currentElement: ReactElement_instance: ReactClass.createClass.Constructor_isOwnerNecessary: false_isTopLevel: false_mountImage: null_mountIndex: 0_mountOrder: 2_pendingCallbacks: null_pendingElement: null_pendingForceUpdate: false_pendingReplaceState: false_pendingStateQueue: null_renderedComponent: ReactCompositeComponentWrapper_rootNodeID: ".0"_warnedAboutRefsInRender: false__proto__: ReactCompositeComponentWrappercontext: Object__proto__: Object__defineGetter__: __defineGetter__()__defineSetter__: __defineSetter__()__lookupGetter__: __lookupGetter__()__lookupSetter__: __lookupSetter__()constructor: Object()hasOwnProperty: hasOwnProperty()isPrototypeOf: isPrototypeOf()propertyIsEnumerable: propertyIsEnumerable()toLocaleString: toLocaleString()toString: toString()valueOf: valueOf()get __proto__: get __proto__()set __proto__: set __proto__()getDOMNode: ()__reactBoundArguments: null__reactBoundContext: ReactClass.createClass.Constructor__reactBoundMethod: ()arguments: (...)bind: (newThis )caller: (...)length: 0name: ""__proto__: ()[[TargetFunction]]: ()[[BoundThis]]: ReactClass.createClass.Constructor[[BoundArgs]]: Array[0]props: Objectrefs: Object__proto__: ObjectrenderButtonSet: ()setSignedIn: ()__reactBoundArguments: null__reactBoundContext: ReactClass.createClass.Constructor__reactBoundMethod: setSignedIn(response)arguments: (...)caller: (...)length: 1name: "setSignedIn"prototype: setSignedIn__proto__: ()<function scope>arguments: (...)bind: (newThis )arguments: (...)caller: (...)length: 1name: ""prototype: boundMethod.bind__proto__: ()<function scope>caller: (...)length: 1name: ""__proto__: ()[[TargetFunction]]: setSignedIn(response)[[BoundThis]]: ReactClass.createClass.Constructor[[BoundArgs]]: Array[0]state: ObjectcurrentUser: Objectcreated_at: "2015-07-24T18:30:38.772+09:00"email: "admin@gmail.com"facebook_account_url: nullfirstName: "유찬"github_account_url: nullgoogleplus_account_url: nullid: 1lastName: "서"linkedin_account_url: nullsns_avatar: nulltwitter_account_url: nullupdated_at: "2015-08-14T02:14:21.091+09:00"__proto__: ObjectsignedIn: true__proto__: Object__proto__: ReactClassComponent

共有1个答案

澹台成龙
2023-03-14

我认为您不应该在ComponentWillmount中使用setState的Ajax调用;在ComponentDidMount中进行。

如果您不想在获得数据之前进行第一次呈现,而这些数据只是用于初始化,请在外部执行调用,并在成功时使用获取的数据呈现视图=====>

<Myview data={initialDataFromTheCallSuccess} /> and then put it in getInitialState

如果选择此路径,请阅读以下内容(如文档中所述,在某些条件下,此路径不是反模式):https://facebook.github.io/react/tips/props-in-getInitialState-as-anti-pattern.html

希望能有所帮助

编辑:有两种方法可以做到这一点,第一种方法是从react类之外获取

  $.ajax({...}).success(function(res) {
      <MyView data={res} /> // render your function on success
  });

在MyView中,您可以从道具“data”中获得InitialState。只有在需要调用get一次时才使用此方法(阅读反模式的内容)。

 类似资料:
  • 问题内容: 我使用React和jQuery。这是我的代码的一部分。 在安装组件之前,我执行ajax请求以了解用户是否已登录。 当响应返回状态码200 时,应该设置状态。我使用的是错误的吗? 编辑01 当我在回调中。 在下面。 解决方案 我上面的代码是反模式。 请遵循答案我建议的一种方法。另外,React文档已经为我的案例提供了非常有用的解决方案:通过AJAX加载初始数据 同样,setState是异

  • 问题内容: 我的AJAX中有一个成功函数,该函数从python脚本返回响应文本,该脚本可以是“ SUCCESS”或“ EMPTY”。现在,我想在成功函数中放置一个if循环,但是if循环不起作用。我从python脚本中获取了正确的数据,因为我的警报语句可以正常工作并打印“ SUCCESS”。但是它不会进入ifloop 我已经尝试了很多方法,但是控件没有进入if循环,有人可以告诉我我在做什么错: 问题

  • 问题内容: 如果我仅向您展示该示例,这将使我更容易解释该问题-> http://jsfiddle.net/RU2SM/ 如您所见,有2个按钮,一个称为“ AJAX”,一个称为“ Direct”。 …因此,如果单击“直接”,它将打开窗口(Chrome上为新标签),但是如果我尝试在AJAX成功处理程序上创建window.open(),则它的工作方式将不同。 我确定问题出在AJAX,但我不知道如何解决。

  • 问题内容: 我想使用jQuery ajax从服务器检索数据。 我想将成功回调函数定义放在如下所示的代码块之外。因此,是否需要像下面这样声明变量,以便能够使用成功回调中返回的数据? 我已经看到大多数人在块内定义成功回调。如果我想在外部定义成功回调,那么以下代码正确吗? 问题答案: 只需使用: 该属性仅需要引用一个函数,并将数据作为参数传递给该函数。 由于声明的方式,您可以像这样访问您的函数。Java

  • 问题内容: 如何从匿名成功函数中更新returnHtml变量? 问题答案: 那是错误的方法。AJAX中的第一个A是异步的。该函数在AJAX调用返回之前返回(或者至少可以返回)。因此,这不是范围问题。这是订购的问题。只有两个选项: 使用选项使AJAX调用同步( 不推荐 );要么 改变思维方式。代替从函数返回HTML,您需要传递一个回调,以在AJAX调用成功时被调用。 作为(2)的示例:

  • 问题内容: 我有一份注册表,正在使用它提交。 这是我的AJAX请求: 在我的 Submit1.php 文件中,我检查数据库中是否存在 电子邮件地址 和 用户 名字 段。如果这些值存在 而没有页面刷新, 则希望显示一条错误消息。 如何将其添加到我的AJAX请求的 成功 回调中? 问题答案: 结果可能不是JSON格式,因此当jQuery尝试如此解析时,它将失败。您可以使用回调函数捕获错误。 无论如何,