首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >反应-显示隐藏两个元素,而不会在页面加载时闪烁

反应-显示隐藏两个元素,而不会在页面加载时闪烁
EN

Stack Overflow用户
提问于 2019-11-05 03:52:32
回答 1查看 3.5K关注 0票数 5

编辑,,我重写了代码,使之更加简约主义。下面的代码是对我的问题的尖峰测试。

以下是这一问题的视频:

https://imgur.com/a/WI2wHMl

我有两个组成部分。

第一个组件名为TextEditor (它是一个文本编辑器),但是它的内容无关紧要--组件可以是任何东西。带有文本的简单div也同样相关。

下一个组件名为工作流,用于呈现来自IndexDB的集合(使用Dexie.js库)。我将这个集合命名为“工作流程”,我存储它们的状态变量名为workflows_list_array

我想做的是:

当页面加载时,我想检查任何工作流是否有特定的ID。如果是这样的话,我会将它们存储在workflows_list_array中并呈现出来。这部分我不需要帮助。

但是,如果不存在具有上述条件的工作流,我希望隐藏名为工作流的组件,并呈现名为TextEditor的组件。如果确实存在工作流,我希望隐藏TextEditor并显示工作流。

问题是,即使我让它正常工作,当工作流确实存在时(当workflows_list_array被填充时),在隐藏之前,TextEditor会短暂地“闪烁”,然后显示工作流组件。

我可以看出这是一个异步问题,但我无法说明如何修复它。

我在下面发布了代码,并试图将其保持在最低限度。

Test.js

代码语言:javascript
复制
import React, {useState, useEffect} from "react";
import db from "../services"

function Workflows(props){
    return (

          <div>
             <ul>
               {
                props.workflows.map((val,index)=>{

                     return <li key={index}>{val.content}</li>
                })
               }
             </ul>
          </div>
    )
}


function TextEditor(){

    return (

          <div> TextEditor </div>
    )
}


function Test(props){
   let [workflows_list_array, set_state_of_workflows_list_array] = useState([]);

   let [client_id_number, set_client_id_number] = useState(5);
      useEffect(() => { // get all workflows of the selected client per its ID

         db.workflows.toArray((workflows_list)=>{    // iterate through workflows array
               return workflows_list

         }).then((workflows_list)=>{

             workflows_list.forEach((val)=>{

                   if(client_id_number === val.client_id){
                       set_state_of_workflows_list_array((prev)=>{
                          return [...prev, val]
                       });
                   }
             });

         });


    }, []);



    return(
        <div>
          {workflows_list_array.length ? null : <TextEditor/> }
          {workflows_list_array.length ? <Workflows workflows={workflows_list_array}/> : null}

        </div>
    )
}


export default Test

services.js

代码语言:javascript
复制
import Dexie from 'dexie';
import 'dexie-observable';


var workflowMagicUserDB = new Dexie("WorkflowMagicUserDB");

workflowMagicUserDB.version(1).stores({
    user: "",
    workflows: "++id,client_id,content,title",
    clients: "++id,name",
    calendar_events: "++id,start,end,title"
});

export default workflowMagicUserDB
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-07 22:14:26

为什么不添加一个标志来指示您是否已经从IndexDB获得数据,比如:

代码语言:javascript
复制
function Test(props){
   const [loading, setLoading] = React.useState(true);
   let [workflows_list_array, set_state_of_workflows_list_array] = useState([]);

   let [client_id_number, set_client_id_number] = useState(5);
      useEffect(() => {
         db.workflows.toArray((workflows_list)=>{
         }).then((workflows_list)=>{
         }).finally(() => setLoading(false)); //when process finishes, it will update the state, at that moment it will render TextEditor or Workflows
    }, []);

   if(loading) return <LoadingIndicator/>; // or something else which indicates the app is fetching or processing data

    return(
        <div>
          {workflows_list_array.length ? null : <TextEditor/> }
          {workflows_list_array.length ? <Workflows workflows={workflows_list_array}/> : null}

        </div>
    )
}


export default Test

当进程完成后,finally将被执行,并将loading状态设置为false,之后,应用程序将呈现TextEditorWorkflows

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58704251

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档