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

更改class变量的值不会更新React中绑定到它的HTML标记

刘意
2023-03-14

我设计了下面的课程。

export default class DataView extends React.Component {

  private message = "---";
  private url = ...;
  private body = { ... };
  private headers = { ... };

  constructor(props: any) {
    super(props);
    this.message = "executing...";

    ajax.post(this.url, this.body, this.headers)
      .subscribe(
        result => {
          this.message = "code " + result.status;
          console.log(result.status);
        },
        error => {
          this.message = "Problem: " + error.status;
          console.log("Problem: " + error.status)
        });
  }

  render() {
    return (
      <div style={divStyle}>
        Message: {this.message}
      </div>);
  }
}

期望原始字符串将被初始消息(发生)替换,然后是调用的结果(不会发生)。我是React的新手,不确定这里有什么问题。这是我在Angular中使用的方法,但当然,在React中的工作方式有点不同。

调用本身是成功的,我可以在控制台中看到正确的结果。只有类变量和呈现值之间的绑定是过时的。我被告知渲染是自动完成的,我不应该自己调用render()。

共有2个答案

赏阳嘉
2023-03-14

如果您想在ajax调用后重新呈现数据,您应该使用state。检查状态和生命周期教程。您的代码应该是这样的:

export default class DataView extends React.Component {

  constructor(props) {
    super(props);
    this.state = {message: 'executing...', body: '', headers: '', 'url': ''}
  }

  componentWillMount() {
      ajax.post(this.state.url, this.state.body, this.state.headers)
          .subscribe(
            result => {
              this.setState({ message: "code " + result.status });
              console.log(result.status);
            },
            error => {
              this.setState({ message: "Problem: " + error.status });
              console.log("Problem: " + error.status)
           });
  }

  render() {
    return (
      <div style={divStyle}>
        Message: {this.state.message}
      </div>);
  }
}
齐锐进
2023-03-14

React不是这样的。只有当您通过setState更改状态时,它才会触发新的渲染。您的消息属性不是state,您不能通过设置state对其进行更改。

此外,从构造函数触发ajax并不是您在React中的做法。相反,您可以在组件ddMount中执行,并且您可以考虑到ajax调用在渲染中并不总是完整的事实。(如果这是不可接受的,那么您将ajax调用提升一个级别,并让父级仅在数据可用时渲染此组件。)

下面是一个示例,它的修改非常小,setTimeout代表ajax;请参见***注释:

class DataView extends React.Component {

  /* These would all probably be state properties
  private message = "---";
  private url = ...;
  private body = { ... };
  private headers = { ... };
  */

  constructor(props) {
    super(props);
    this.state = {                                  // *** Put `message`
        message: "executing..."                     // *** on `state`
    };
  }
  
  componentDidMount() {                             // *** Use `componentDidMount`
    /*                                              // *** to start async load
    ajax.post(this.url, this.body, this.headers)
      .subscribe(
        result => {
          this.message = "code " + result.status;
          console.log(result.status);
        },
        error => {
          this.message = "Problem: " + error.status;
          console.log("Problem: " + error.status)
        });
    */
    setTimeout(() => {
        this.setState({                             // *** Update state with
            message: "code GOTSTATE"                // *** `setState`
        });
    }, 800);
  }

  render() {
    return (
      // *** No idea where `divStyle` was meant to come from, left it out below
      // Note using `this.state.message` below
      <div>
        Message: {this.state.message}
      </div>);
  }
}


ReactDOM.render(
  <DataView />,
  document.getElementById("root")
);
<div id="root"></div>

<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.js"></script>
 类似资料:
  • 问题内容: 我已经编写了angularjs指令。在该指令的模板中,我添加了一个ngIf指令,并在其中显示绑定到指令范围的输入。 经过大量的反复试验,我注意到ngIf指令导致更改输入文本时模型无法更新。如果我将其更改为ngShow,则一切正常。 我正在寻找这种差异的解释 我在这里创建了一个jsfiddle 问题答案: 之所以会这样,是因为ngIf创建了一个新的子作用域,因此,如果您想绑定到与其他输入

  • 谁能帮我解决这个问题,或者给我指出正确的方向? 我正在使用Python 3.9.7 我的目标是创建一个python程序,使用Tkinter显示两个变量之间的时间差,我希望这个变量在倒计时时每秒更新一次。 我已经创建了TK窗口,其中显示了标题文本和timedif标签,但是当我的程序运行时,timedif标签不会更新。Timedif标签仅显示程序执行时的timedelta。 我定义了一个函数count

  • 问题内容: 这是我的HTML: 当我在框中输入内容时,该模型会通过2向绑定机制进行更新。甜。 但是, 当我通过JQuery执行此操作时… 它不会更新模型。为什么? 问题答案: Angular不知道这种变化。为此,您应该在以下位置致电或进行更改: 看到这个以更好地了解 脏检查 更新 :这是一个示例

  • 我想要一个udf函数,它遍历列“Values”,并检查下一个值是否是当前行值的50%或更多。如果它在50%之内,那么我希望包含值“是”,如果不是,那么我不希望包含值。如果该值在最后一个值和下一个值之间下降得太快,则不应将其包括在内,但如果该值逐渐下降,且与最后一个包括的值相比不超过50%,则可以。这就是为什么。未包括id 5的1,但。包含id 9的1,因为它遵循的值从逐渐下降。4不超过50%。我曾

  • 问题内容: 我尝试编写一个小指令,以将其内容包装在另一个模板文件中。 这段代码: 应该有以下输出: 因为布局“默认”具有以下代码: 这里的指令代码: }); 我的问题: 例如,当我在模板(在布局模板中或在布局标签内部)中使用范围变量时。它只是最初工作。如果我更新变量,则该指令不再更新。整个链接功能只会被触发一次。 我认为,AngularJS不知道,该指令使用范围变量,因此不会被更新。但是我不知道如

  • 问题内容: 这个问题不太可能对将来的访客有所帮助;它仅与较小的地理区域,特定的时间段或极为狭窄的情况(通常不适用于Internet的全球受众)有关。要获得使该问题更广泛适用的帮助,请访问帮助中心。 7年前关闭。 我得到一个页面网址,例如。现在,有人告诉我将b的值更改为5,以使其变为。 即从更改为 注意:此处的变量b可以引用任何名称。 问题答案: 采用 从URL中提取查询字符串 将查询字符串拆分为一