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

为什么此setState调用不触发呈现?

芮瑾瑜
2023-03-14

我试着读过类似的问题,但没有成功。

export default class Tree extends Component<ITreeProps, ITreeState> {

    public constructor(props: ITreeProps, state: ITreeState) {
        super(props, state);

        Tree.GetJsonStructure(props.Path).then(response => {
            this.setState({
                data : JSON.parse(response)               
            });
            console.log(response);
          });          
    }

    public static GetJsonStructure(jsonPath: string): Promise<string>{
        return new Promise((resolve, reject) => {
          axios.get(jsonPath, { responseType: 'arraybuffer' }).then(response => {
            if (response.status !== 200) {
              // handle error
              reject("FAIL!");
            }
            var buf = new Buffer(response.data);
            //var buf = Buffer.concat(response.data);
            var paki = pako.inflate(buf);
            var decoder = new encoding.TextDecoder();
            var stringo = decoder.decode(paki);
            resolve(stringo);
          });
        });
      }

    public render(): React.ReactElement<ITreeProps> {
        console.log("RENDERINGGGG");
        console.log(this.state)

        if(!this.state || !this.state.data || this.state.data.length == 0 ){
            return <div></div>;
        }

        const data = this.state.data;

        if (!data || data.length == 0) 
            console.log("No properties set for the application");

        return (
          <div className={styles.ToolboxLinkPanel}>
              {
                  data.map(node => (
                      <TreeNode key={node.key} label={node.label} children={node.nodes} isOpen={true} ></TreeNode>
                  ))
              }
          </div>
        );
      }
}

共有1个答案

丌官子安
2023-03-14

您需要在componentdidmount而不是构造函数中调用api方法:

componentDidMount() {
  Tree.GetJsonStructure(props.Path).then(response => {
    this.setState({
      data: JSON.parse(response)
    });
    console.log(response);
  });
}

至于为什么它是进行api调用的地方,官方文档详细说明了(重点是添加的):

componentDidMount()在组件装入(插入到树中)后立即调用。需要DOM节点的初始化应该在这里进行。如果需要从远程endpoint加载数据,这是实例化网络请求[...]的好地方它将触发一个额外的渲染,但它将发生在浏览器更新屏幕之前…

 类似资料:
  • 问题内容: 在下面的示例中,我无法弄清楚为什么未触发$ destroy事件。有人可以解释为什么不触发它,以及在什么情况下会触发它吗? 这是pl客:http ://plnkr.co/edit/3Fz50aNeuculWKJ22iAX?p=preview JS HTML 问题答案: 问题是您正在上监听事件,但正在上触发该事件。 来自angular.js来源(我确定它已记录在网站上的某个地方,但我没有看

  • 问题内容: 该功能运行什么?它只会运行吗? 问题答案: setState()将按以下顺序运行函数: 如果您的组件正在接收道具,它将使用上述功能运行该功能。

  • React引入了新的静态方法,它在每个呈现方法之前都会被调用,但为什么呢?在prop change之后调用它对我来说是有意义的,但是在之后调用它就没有意义了,也许我错过了什么。 我根据公司的要求创建了一个组件,在组件中日期是从道具控制的。我在组件中有以下状态。 是的,我在中创建了一个额外的变量来跟踪是否由于而被调用,但我认为这不是正确的方法。 或者是我做错了什么或者遗漏了什么,或者不应该在之后调用

  • 问题内容: 我的代码中有一个。我已添加。但是它还是没有被触发。我已经尝试了很多时间,但是没有找到解决方案。 但是控制台中没有任何内容。请建议我我在做什么错。 问题答案: FocusListener不是JComboBox的适当监听器,另外一个监听器可以创建无限循环(尤其是可编辑的JComboBox), 的FocusListener是异步的,有时是太难捕捉事件是正确的订单特别是在案件JComponen

  • 我需要测试一个服务类,但是当我试图模拟dao类时,它没有被触发,因此不能使用ThenReturn()。 我认为问题是因为我在服务类(Spring MVC 3.1)中为我的Dao和@Autowired使用了一个接口: 接口: 执行情况: 成功了!

  • 这个问题在这里总结得很好;基本上,如果您在useEffect中有一个异步函数(这是您期望的函数),您将导致每个更新状态的组件的重新呈现。我通常不想像作者的解决方案/变通方法那样把事情堆在一起,对我来说,这种行为没有意义(您希望所有的状态更新都一起发生)。