<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Jessica Moretti</title>
    <description>The latest articles on DEV Community by Jessica Moretti (@nevromantik).</description>
    <link>https://dev.to/nevromantik</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1015757%2Fde6be3f3-0f6a-4b16-95e5-a33d19ba7985.png</url>
      <title>DEV Community: Jessica Moretti</title>
      <link>https://dev.to/nevromantik</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nevromantik"/>
    <language>en</language>
    <item>
      <title>React component does not update automatically in UI but only in array</title>
      <dc:creator>Jessica Moretti</dc:creator>
      <pubDate>Fri, 27 Jan 2023 16:36:15 +0000</pubDate>
      <link>https://dev.to/nevromantik/react-component-does-not-update-automatically-in-ui-but-only-in-array-4809</link>
      <guid>https://dev.to/nevromantik/react-component-does-not-update-automatically-in-ui-but-only-in-array-4809</guid>
      <description>&lt;p&gt;I'm a newbie to react and I have a problem. When I try to add a new item to my list, the component updates but "closes", in fact to see the new item added to the list, I have to click again on the categories' list. At that point it updates. I have this problem in both the 'todos' component and the 'subtodos' component but not in categories. &lt;/p&gt;

&lt;p&gt;How can I do?&lt;/p&gt;

&lt;p&gt;data:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const datas = [
  {
    categoryTitle: "oggi",
    categoryId: "1",
    todos: [
      {
        todoName: "pulire",
        todoId: "a",
        completed: false,
        subTodos: [
          { subTodoName: "pulire bagno", subTodoId: "a1", completed: false },
          { subTodoName: "pulire cucina", subTodoId: "a2", completed: false },
        ],
      },
      {
        todoName: "cucinare",
        todoId: "b",
        completed: false,
        subTodos: [
          { subTodoName: "cucinare primo", subTodoId: "a3", completed: false },
          {
            subTodoName: "cucinare secondo",
            subTodoId: "a4",
            completed: false,
          },
        ],
      },
    ],
  },

  {
    categoryTitle: "pianificato",
    categoryId: "2",
    todos: [
      {
        todoName: "studiare",
        todoId: "c",
        completed: false,
        subTodos: [
          {
            subTodoName: "studiare geometria",
            subTodoId: "a1",
            completed: false,
          },
          {
            subTodoName: "studiare matematica",
            subTodoId: "a2",
            completed: false,
          },
        ],
      },
      {
        todoName: "spesa",
        todoId: "d",
        completed: false,
        subTodos: [
          { subTodoName: "zucchine", subTodoId: "a3", completed: false },
          { subTodoName: "pasta", subTodoId: "a4", completed: false },
        ],
      },
    ],
  },
];

export default datas;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;app.js:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function App() {
  const [todoDatas, setTodoDatas] = useState(datas);
  const [selectedItem, setSelectedItem] = useState();
  const [todoId, setTodoId] = useState();
  const [selectedTodo, setSelectedTodo] = useState();
  return (
    &amp;lt;DataContext.Provider
      value={{
        todoDatas,
        setTodoDatas,
        selectedItem,
        setSelectedItem,
        todoId,
        setTodoId,
        selectedTodo,
        setSelectedTodo,
      }}
    &amp;gt;
      &amp;lt;ComponentContainer&amp;gt;
        &amp;lt;Categories /&amp;gt;
        &amp;lt;Todos /&amp;gt;
        &amp;lt;Subtodos /&amp;gt;
      &amp;lt;/ComponentContainer&amp;gt;
    &amp;lt;/DataContext.Provider&amp;gt;
  );
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Categories.js&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function Categories() {
  const { todoDatas, setTodoDatas, setSelectedItem } = useContext(DataContext);

  const [categoryInput, setcategoryInput] = useState(null);

  const catchCategory = (value) =&amp;gt; {
    setcategoryInput(value);
  };
  const resetCategory = () =&amp;gt; {
    setcategoryInput("");
  };
  const addCategory = () =&amp;gt; {
    if (
      categoryInput !== null &amp;amp;&amp;amp;
      categoryInput !== "" &amp;amp;&amp;amp;
      categoryInput !== undefined
    ) {
      setTodoDatas((prev) =&amp;gt; {
        return [
          ...prev,
          {
            categoryTitle: categoryInput,
            categoryId: uniqid(),
            todos: [],
          },
        ];
      });
    }
  };
  return (
    &amp;lt;div className="app_wrap"&amp;gt;
      &amp;lt;div className="categories_wrap"&amp;gt;
        &amp;lt;h5&amp;gt;jessicamoretti@gmail.com&amp;lt;/h5&amp;gt;
        &amp;lt;input type="text" placeholder="search"&amp;gt;&amp;lt;/input&amp;gt;
        {todoDatas?.map((category) =&amp;gt; {
          return (
            &amp;lt;p
              key={category.categoryId}
              id={category.categoryId}
              onClick={() =&amp;gt; {
                setSelectedItem(
                  todoDatas.find((cat) =&amp;gt; {
                    return cat.categoryId === category.categoryId;
                  })
                );
              }}
            &amp;gt;
              {category.categoryTitle}
            &amp;lt;/p&amp;gt;
          );
        })}
        &amp;lt;form
          onClick={(e) =&amp;gt; {
            e.preventDefault();
            addCategory();
          }}
        &amp;gt;
          &amp;lt;input
            type="text"
            onChange={(e) =&amp;gt; {
              catchCategory(e.target.value);
            }}
          &amp;gt;&amp;lt;/input&amp;gt;
          &amp;lt;button onClick={resetCategory}&amp;gt;Nuovo elenco&amp;lt;/button&amp;gt;
        &amp;lt;/form&amp;gt;
      &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
  );
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Todos.js&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function Todos() {
  const {
    setSelectedItem,
    selectedItem,
    todoId,
    setTodoId,
    todoDatas,
    setTodoDatas,
  } = useContext(DataContext);

  const [todoInput, setTodoInput] = useState();

  const catchTodo = (value) =&amp;gt; {
    setTodoInput(value);
  };
  const resetTodo = () =&amp;gt; {
    setTodoInput("");
  };
  const addTodo = (obj) =&amp;gt; {
    if (todoInput !== null &amp;amp;&amp;amp; todoInput !== "" &amp;amp;&amp;amp; todoInput !== undefined) {
      setSelectedItem(
        selectedItem?.todos?.push({
          todoName: todoInput,
          todoId: uniqid(),
          completed: false,
          subTodos: [],
        })
      );
    }
  };
  return (
    &amp;lt;div className="todos_subtodos_wrap"&amp;gt;
      &amp;lt;div className="todos_wrap"&amp;gt;
        {selectedItem?.todos?.map((todo) =&amp;gt; {
          return (
            &amp;lt;div className="todo" key={todo.todoId}&amp;gt;
              &amp;lt;p
                id={todo.todoId}
                onClick={() =&amp;gt; {
                  setTodoId(todo.todoId);
                }}
              &amp;gt;
                {todo.todoName}
              &amp;lt;/p&amp;gt;
              &amp;lt;p&amp;gt;subtodo: 0 of {todo.subTodos?.length} &amp;lt;/p&amp;gt;
            &amp;lt;/div&amp;gt;
          );
        })}

        &amp;lt;form
          className="todos_form"
          onClick={(e) =&amp;gt; {
            e.preventDefault();
            addTodo();
          }}
        &amp;gt;
          &amp;lt;input
            type="text"
            className="todos_input"
            placeholder="add todos"
            onChange={(e) =&amp;gt; {
              catchTodo(e.target.value);
            }}
          &amp;gt;&amp;lt;/input&amp;gt;
          &amp;lt;button className="add_todos" onClick={resetTodo}&amp;gt;
            add todos
          &amp;lt;/button&amp;gt;
        &amp;lt;/form&amp;gt;
      &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
  );
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Subtodos.js&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function Subtodos() {
  const {
    setSelectedItem,
    selectedItem,
    todoId,
    setTodoId,
    selectedTodo,
    setSelectedTodo,
  } = useContext(DataContext);
  const [subTodoInput, setSubTodoInput] = useState();
  const [subTodos, setSubTodos] = useState(selectedTodo);
  let selected = selectedItem?.todos?.find((el) =&amp;gt; {
    return el.todoId === todoId;
  });
  console.log(selectedItem, "selected item");
  useEffect(() =&amp;gt; {
    setSelectedTodo(selected); // contiene il todo selezionato
  }, [selected, setSelectedTodo]);

  const catchSubTodo = (value) =&amp;gt; {
    setSubTodoInput(value);
  };
  const addSub = () =&amp;gt; {
    if (
      subTodoInput !== null &amp;amp;&amp;amp;
      subTodoInput !== "" &amp;amp;&amp;amp;
      subTodoInput !== undefined
    ) {
      setSelectedTodo(
        selected?.subTodos?.push({
          subTodoName: subTodoInput,
          subTodoId: uniqid(),
          completed: false,
        })
      );
    }
  };

  return (
    &amp;lt;div&amp;gt;
      &amp;lt;div&amp;gt;
        {selectedTodo?.subTodos?.map((el) =&amp;gt; {
          return (
            &amp;lt;div key={el.subTodoId}&amp;gt;
              &amp;lt;p&amp;gt; {el.subTodoName}&amp;lt;/p&amp;gt;
            &amp;lt;/div&amp;gt;
          );
        })}

        &amp;lt;form
          onClick={(e) =&amp;gt; {
            e.preventDefault();
            addSub();
          }}
        &amp;gt;
          &amp;lt;input
            type="text"
            placeholder="+ Aggiungi sottoattività"
            onChange={(e) =&amp;gt; {
              e.preventDefault();
              catchSubTodo(e.target.value);
            }}
          &amp;gt;&amp;lt;/input&amp;gt;
          &amp;lt;button
            onClick={(e) =&amp;gt; {
              e.preventDefault();
            }}
          &amp;gt;&amp;lt;/button&amp;gt;
        &amp;lt;/form&amp;gt;
      &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
  );
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>javascript</category>
      <category>json</category>
      <category>automation</category>
      <category>api</category>
    </item>
  </channel>
</rss>
