{"id":2056,"date":"2020-06-04T08:42:18","date_gmt":"2020-06-04T06:42:18","guid":{"rendered":"https:\/\/ways4.eu\/?p=2056"},"modified":"2022-01-13T21:40:36","modified_gmt":"2022-01-13T19:40:36","slug":"how-to-kollaborative-aufgabenliste-in-react","status":"publish","type":"post","link":"https:\/\/ways4.eu\/de\/blog\/2020\/06\/04\/how-to-kollaborative-aufgabenliste-in-react\/","title":{"rendered":"HowTo: Erstellen von kollaborativen Echtzeit-Aufgabenlisten in React"},"content":{"rendered":"<p>Nachdem nun <strong>Wunderlist<\/strong> ja leider <em>Geschichte<\/em> ist wollen wir uns heute mal anschauen, wie man sich diesen &#8211; <a href=\"https:\/\/community-tasks.now.sh\/\">https:\/\/community-tasks.now.sh\/<\/a> &#8211; einfachen und <strong>kollaborativen Echtzeit-Tasklistendienst<\/strong> selbst erstellt.<br \/>\nBenutzer k\u00f6nnen damit eine neue Liste erstellen und diese mit Freunden \/ Kollegen teilen, um die Liste gemeinsam zu bearbeiten und vervollst\u00e4ndigen.<\/p>\n<p><a href=\"https:\/\/ways4.eu\/wp-content\/uploads\/2020\/06\/communityTaskListMain.jpg\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone wp-image-2058\" src=\"https:\/\/ways4.eu\/wp-content\/uploads\/2020\/06\/communityTaskListMain-300x99.jpg\" alt=\"\" width=\"700\" height=\"231\" srcset=\"https:\/\/ways4.eu\/wp-content\/uploads\/2020\/06\/communityTaskListMain-300x99.jpg 300w, https:\/\/ways4.eu\/wp-content\/uploads\/2020\/06\/communityTaskListMain.jpg 843w\" sizes=\"(max-width: 700px) 100vw, 700px\" \/><\/a><\/p>\n<p>Wir werden Functional React im Frontend und Supabase als Datenbank- und Echtzeit-Engine verwenden. <a href=\"https:\/\/supabase.io\/docs\/about\">(Was ist Supabase?)<\/a><\/p>\n<p>Wer die folgende Lekt\u00fcre \u00fcberspringen\u00a0 m\u00f6chte, findet den Quellcode der Anwendung hier: <a href=\"https:\/\/github.com\/smartDevel\/community-tasks\">https:\/\/github.com\/smartDevel\/community-tasks<\/a><\/p>\n<p>Anderenfalls steigen wir nun in die Details ein ?<\/p>\n<h3>1) Projektbasis erstellen<\/h3>\n<p>Daf\u00fcr nutzen wir <a href=\"https:\/\/reactjs.org\/docs\/create-a-new-react-app.html\">create-react-app<\/a><\/p>\n<p><code>npx create-react-app community-tasks<\/code><\/p>\n<p>Nachdem die initiale Struktur erstellt wurde, werden wir unser Projekt etwas (re-) strukturieren, so dass es im Code-Editor in etwa so aussieht:<\/p>\n<figure id=\"attachment_2065\" aria-describedby=\"caption-attachment-2065\" style=\"width: 269px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/ways4.eu\/wp-content\/uploads\/2020\/06\/communityTaskListVSCodeFiles.jpg\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-2065 size-full\" src=\"https:\/\/ways4.eu\/wp-content\/uploads\/2020\/06\/communityTaskListVSCodeFiles.jpg\" alt=\"VSCode Files\" width=\"269\" height=\"287\" \/><\/a><figcaption id=\"caption-attachment-2065\" class=\"wp-caption-text\">VSCode Filestruktur<\/figcaption><\/figure>\n<p><code>index.js<\/code> wird unser Einstiegspunkt sein, an dem wir <strong>neue Listen<\/strong> erstellen, <code>TodoList.js<\/code> wird die <strong>Liste<\/strong> sein, die wir erstellen, und wir werden alle unsere <strong>Daten<\/strong> aus<code> Store.js<\/code> abrufen.<\/p>\n<p>Dann m\u00fcssen wir noch folgende Abh\u00e4ngigkeiten in unsere <code>package.json<\/code> eintragen:<\/p>\n<figure id=\"attachment_2068\" aria-describedby=\"caption-attachment-2068\" style=\"width: 300px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/ways4.eu\/wp-content\/uploads\/2020\/06\/communityTaskListPackageJSON.jpg\"><img decoding=\"async\" loading=\"lazy\" class=\"size-medium wp-image-2068\" src=\"https:\/\/ways4.eu\/wp-content\/uploads\/2020\/06\/communityTaskListPackageJSON-300x147.jpg\" alt=\"package.json abh\u00e4ngigkeiten\" width=\"300\" height=\"147\" srcset=\"https:\/\/ways4.eu\/wp-content\/uploads\/2020\/06\/communityTaskListPackageJSON-300x147.jpg 300w, https:\/\/ways4.eu\/wp-content\/uploads\/2020\/06\/communityTaskListPackageJSON.jpg 401w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><figcaption id=\"caption-attachment-2068\" class=\"wp-caption-text\">package.json abh\u00e4ngigkeiten<\/figcaption><\/figure>\n<p>und schlie\u00dflich das ganze noch via <code>npm install<\/code>installieren.\u2640\ufe0f<\/p>\n<h3>2) <a href=\"https:\/\/github.com\/smartDevel\/community-tasks\/blob\/master\/src\/index.js\" target=\"_blank\" rel=\"noopener noreferrer\">index.js<\/a><\/h3>\n<p>Wir f\u00fcgen unserem Basis-Router die Render-Funktion hinzu:<\/p>\n<div class=\"highlight\">\n<pre class=\"highlight jsx\"><code><span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">render<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">react-dom<\/span><span class=\"dl\">'<\/span>\n\n<span class=\"nx\">render<\/span><span class=\"p\">(<\/span>\n  <span class=\"p\">&lt;<\/span><span class=\"nt\">div<\/span> <span class=\"na\">className=<\/span><span class=\"s2\">\"App\"<\/span><span class=\"p\">&gt;<\/span>\n    <span class=\"p\">&lt;<\/span><span class=\"nc\">Router<\/span><span class=\"p\">&gt;<\/span>\n      <span class=\"p\">&lt;<\/span><span class=\"nc\">Switch<\/span><span class=\"p\">&gt;<\/span>\n        <span class=\"p\">&lt;<\/span><span class=\"nc\">Route<\/span> <span class=\"nt\">exact<\/span> <span class=\"na\">path=<\/span><span class=\"s2\">\"\/\"<\/span> <span class=\"na\">component=<\/span><span class=\"si\">{<\/span><span class=\"nx\">Home<\/span><span class=\"si\">}<\/span> <span class=\"p\">\/&gt;<\/span>\n        <span class=\"si\">{<\/span><span class=\"cm\">\/* weitere Routen ab hier *\/<\/span><span class=\"si\">}<\/span>\n      <span class=\"p\">&lt;\/<\/span><span class=\"nc\">Switch<\/span><span class=\"p\">&gt;<\/span>\n    <span class=\"p\">&lt;\/<\/span><span class=\"nc\">Router<\/span><span class=\"p\">&gt;<\/span>\n  <span class=\"p\">&lt;\/<\/span><span class=\"nt\">div<\/span><span class=\"p\">&gt;,<\/span>\n  <span class=\"nb\">document<\/span><span class=\"p\">.<\/span><span class=\"nx\">body<\/span>\n<span class=\"p\">)<\/span>\n<\/code><\/pre>\n<\/div>\n<p>Danach bereiten wir unsere main-Komponente vor:<\/p>\n<div>\n<pre>const\u00a0newList\u00a0=\u00a0async\u00a0(history)\u00a0=&gt;\u00a0{\n\u00a0\u00a0const\u00a0list\u00a0=\u00a0await\u00a0createList(uuidv4());\n\u00a0\u00a0history.push(`\/?uuid=${list.uuid}`);\n};\nconst\u00a0Home\u00a0=\u00a0(props)\u00a0=&gt;\u00a0{\n\u00a0 const\u00a0history\u00a0=\u00a0useHistory();\n\u00a0 const\u00a0uuid\u00a0=\u00a0queryString.parse(props.location.search).uuid;\n\u00a0 \/\/GIF-Animation\u00a0auf\u00a0wordpress\u00a0f\u00fcr\u00a0Startscreen-Bild\n\u00a0 const\u00a0imgStartscreen\u00a0=\u00a0\"https:\/\/ways4eu.files.wordpress.com\/2020\/06\/startscreengifanimationv04.gif\";\n  const lnkGithub = \"https:\/\/github.com\/smartDevel\/community-tasks\";\n  const lnkTutorial =\n    \"https:\/\/dev.to\/awalias\/howto-build-collaborative-realtime-task-lists-in-react-4k52\";\n  const lnkDatabase = \"https:\/\/supabase.io\";\n\n  if (uuid) return TodoList(uuid);\n\u00a0\u00a0else\u00a0{\n\u00a0\u00a0\u00a0\u00a0return\u00a0(\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;div\u00a0className=\"container\"&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;div\u00a0className=\"section\"&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;h1&gt;Kollaborative\u00a0Aufgabenlisten&lt;\/h1&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;small&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Powered\u00a0by\u00a0&lt;a\u00a0href={lnkDatabase}&gt;Supabase&lt;\/a&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/small&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/div&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;div\u00a0className=\"section\"&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;button\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0className=\"bNew\"\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0onClick={()\u00a0=&gt;\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0newList(history);\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}}\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Neue\u00a0Aufgabenliste\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/button&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/div&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;div\u00a0className=\"section\u00a0build\"&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;h3&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0HowTo:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;br\u00a0\/&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;a\u00a0href={lnkTutorial}&gt;Tutorial&lt;\/a&gt;\u00a0|\u00a0&lt;a\u00a0href={lnkGithub}&gt;Github&lt;\/a&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/h3&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\/*\u00a0***\u00a0Alternative\u00a0mit\u00a0input-Feld\u00a0***\u00a0*\/}\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;input\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0type=\"image\"\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0src={imgStartscreen}\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0onClick={()\u00a0=&gt;\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0newList(history);\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}}\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0alt=\"Neue\u00a0Aufgabenliste\"\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\/*\u00a0***\u00a0Alternative\u00a0mit\u00a0Button\u00a0***\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;button \n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0onClick={()\u00a0=&gt;\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0newList(history)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}}&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;img\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0className=\"build-img\"\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0src={imgStartscreen}\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0alt=\"learn\u00a0how\u00a0to\u00a0build\u00a0this\"\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/button&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0*\/}\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\/*\u00a0***\u00a0Alternative\u00a0mit\u00a0Hyperlink\u00a0***\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;a\u00a0onClick={()\u00a0=&gt;\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0newList(history)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}}&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;img\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0className=\"build-img\"\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0src={imgStartscreen}\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0alt=\"learn\u00a0how\u00a0to\u00a0build\u00a0this\"\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/&gt;\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/a&gt;\u00a0*\/}\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/div&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/div&gt;\n\u00a0\u00a0\u00a0\u00a0);\n\u00a0\u00a0}\n};<\/pre>\n<p>Der <strong>wichtigste Teil<\/strong> hierbei ist, dass wir beim Klicken auf die Schaltfl\u00e4che &#8222;Liste erstellen&#8220; eine Liste <code>createList(uuidv4())<\/code> mit einer zuf\u00e4llig generierten UUID erstellen und diese dann mit <code>useHistory ()<\/code> und <code>history.push (...)<\/code> als Abfrageparameter an die aktuelle URL anh\u00e4ngen. Wir tun dies, damit der Benutzer die URL aus der URL-Leiste kopieren und teilen kann.<\/p>\n<p>Auch wenn ein neuer Benutzer einen Link mit uuid erh\u00e4lt &#8211; die Anwendung wei\u00df, dass sie die spezifische Aufgabenliste aus der <strong>Datenbank mit der angegebenen UUID<\/strong> nachschlagen muss, dies ist hier zu sehen:<\/p>\n<\/div>\n<div>\n<div><code>const\u00a0uuid\u00a0=\u00a0queryString.parse(props.location.search).uuid;<\/code><\/div>\n<div>\n<div>\n<div><code>if\u00a0(uuid)\u00a0return\u00a0TodoList(uuid);<\/code><\/div>\n<div><\/div>\n<\/div>\n<\/div>\n<\/div>\n<div>\n<h3>3) <a href=\"https:\/\/github.com\/smartDevel\/community-tasks\/blob\/master\/src\/Store.js\" target=\"_blank\" rel=\"noopener noreferrer\">Store.js<\/a><\/h3>\n<p>Jetzt schauen wir uns an, wie wir die Daten in Echtzeit speichern, abrufen und \u00fcberwachen, damit den adressierten Nutzern die jeweils aktuelle Liste mit allen neuen und bereits abgeschlossenen Aufgaben angezeigt wird, ohne dass diese die Seite erneut aktualisieren m\u00fcssen.<\/p>\n<div>\n<div><code>import\u00a0{\u00a0useState,\u00a0useEffect\u00a0}\u00a0from\u00a0'react'<\/code><\/div>\n<div><code>import\u00a0{\u00a0createClient\u00a0}\u00a0from\u00a0'@supabase\/supabase-js'<\/code><\/div>\n<div><code>const\u00a0supabase\u00a0=\u00a0createClient(<\/code><\/div>\n<div><code>\u00a0\u00a0process.env.REACT_APP_SUPABASE_URL,<\/code><\/div>\n<div><code>\u00a0\u00a0process.env.REACT_APP_SUPABASE_KEY<\/code><\/div>\n<div><code>)<\/code><\/div>\n<\/div>\n<\/div>\n<div>Wir ben\u00f6tigen eine<strong> .env-Datei im Root- Verzeichnis<\/strong>, in der wir folgende Variablen speichern:<\/div>\n<div>\n<pre class=\"highlight shell\"><code><span class=\"nv\">REACT_APP_SUPABASE_URL<\/span><span class=\"o\">=<\/span>&lt;meine-url&gt;\n<span class=\"nv\">REACT_APP_SUPABASE_KEY<\/span><span class=\"o\">=<\/span>&lt;mein-key&gt;<\/code><\/pre>\n<\/div>\n<div>Um die individuellen <strong>Supabase-Anmeldeinformationen<\/strong> abzurufen, rufen wir <a href=\"https:\/\/app.supabase.io\/\" target=\"_blank\" rel=\"noopener noreferrer\">app.supabase.io<\/a> auf, erstellen eine neue Organisation und ein neues Projekt und navigieren zur API-Seite, auf der die ben\u00f6tigten Informationen zu finden sind:<\/div>\n<div>\n<figure id=\"attachment_2077\" aria-describedby=\"caption-attachment-2077\" style=\"width: 664px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/ways4.eu\/wp-content\/uploads\/2020\/06\/communityTaskListSupabebe_API.jpg\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-2077\" src=\"https:\/\/ways4.eu\/wp-content\/uploads\/2020\/06\/communityTaskListSupabebe_API-300x19.jpg\" alt=\"API-Ansicht supabase\" width=\"664\" height=\"42\" srcset=\"https:\/\/ways4.eu\/wp-content\/uploads\/2020\/06\/communityTaskListSupabebe_API-300x19.jpg 300w, https:\/\/ways4.eu\/wp-content\/uploads\/2020\/06\/communityTaskListSupabebe_API-1536x99.jpg 1536w, https:\/\/ways4.eu\/wp-content\/uploads\/2020\/06\/communityTaskListSupabebe_API.jpg 1549w\" sizes=\"(max-width: 664px) 100vw, 664px\" \/><\/a><figcaption id=\"caption-attachment-2077\" class=\"wp-caption-text\">API-Ansicht in supabase-Konfigurationsseite<\/figcaption><\/figure>\n<p>In der <strong>Supabase Konfiguration<\/strong> gehen wir anschlie\u00dfend zur Registerkarte SQL, auf der wir unsere beiden Tabellen <strong>Listen (lists)<\/strong> und <strong>Aufgaben (tasks)<\/strong> mit dem integrierten SQL-Interpreter erstellen. Dort werden wir folgende SQL-Befehle zum Erstellen der Tabellen eintragen und ausf\u00fchren lassen:<\/p>\n<\/div>\n<div class=\"highlight\">\n<pre class=\"highlight sql\"><code><span class=\"k\">CREATE<\/span> <span class=\"k\">TABLE<\/span> <span class=\"n\">lists<\/span> <span class=\"p\">(<\/span>\n  <span class=\"n\">uuid<\/span> <span class=\"nb\">text<\/span><span class=\"p\">,<\/span>\n  <span class=\"n\">id<\/span> <span class=\"n\">bigserial<\/span> <span class=\"k\">PRIMARY<\/span> <span class=\"k\">KEY<\/span><span class=\"p\">,<\/span>\n  <span class=\"n\">inserted_at<\/span> <span class=\"nb\">timestamp<\/span> <span class=\"k\">without<\/span> <span class=\"nb\">time<\/span> <span class=\"k\">zone<\/span> <span class=\"k\">DEFAULT<\/span> <span class=\"n\">timezone<\/span><span class=\"p\">(<\/span><span class=\"s1\">'utc'<\/span> <span class=\"p\">::<\/span> <span class=\"nb\">text<\/span><span class=\"p\">,<\/span> <span class=\"n\">now<\/span><span class=\"p\">())<\/span> <span class=\"k\">NOT<\/span> <span class=\"k\">NULL<\/span><span class=\"p\">,<\/span>\n  <span class=\"n\">updated_at<\/span> <span class=\"nb\">timestamp<\/span> <span class=\"k\">without<\/span> <span class=\"nb\">time<\/span> <span class=\"k\">zone<\/span> <span class=\"k\">DEFAULT<\/span> <span class=\"n\">timezone<\/span><span class=\"p\">(<\/span><span class=\"s1\">'utc'<\/span> <span class=\"p\">::<\/span> <span class=\"nb\">text<\/span><span class=\"p\">,<\/span> <span class=\"n\">now<\/span><span class=\"p\">())<\/span> <span class=\"k\">NOT<\/span> <span class=\"k\">NULL<\/span>\n<span class=\"p\">);<\/span>\n\n<span class=\"k\">CREATE<\/span> <span class=\"k\">TABLE<\/span> <span class=\"n\">tasks<\/span> <span class=\"p\">(<\/span>\n  <span class=\"n\">task_text<\/span> <span class=\"nb\">text<\/span> <span class=\"k\">NOT<\/span> <span class=\"k\">NULL<\/span><span class=\"p\">,<\/span>\n  <span class=\"n\">complete<\/span> <span class=\"nb\">boolean<\/span> <span class=\"k\">DEFAULT<\/span> <span class=\"k\">false<\/span><span class=\"p\">,<\/span>\n  <span class=\"n\">id<\/span> <span class=\"n\">bigserial<\/span> <span class=\"k\">PRIMARY<\/span> <span class=\"k\">KEY<\/span><span class=\"p\">,<\/span>\n  <span class=\"n\">list_id<\/span> <span class=\"nb\">bigint<\/span> <span class=\"k\">REFERENCES<\/span> <span class=\"n\">lists<\/span> <span class=\"k\">NOT<\/span> <span class=\"k\">NULL<\/span><span class=\"p\">,<\/span>\n  <span class=\"n\">inserted_at<\/span> <span class=\"nb\">timestamp<\/span> <span class=\"k\">without<\/span> <span class=\"nb\">time<\/span> <span class=\"k\">zone<\/span> <span class=\"k\">DEFAULT<\/span> <span class=\"n\">timezone<\/span><span class=\"p\">(<\/span><span class=\"s1\">'utc'<\/span> <span class=\"p\">::<\/span> <span class=\"nb\">text<\/span><span class=\"p\">,<\/span> <span class=\"n\">now<\/span><span class=\"p\">())<\/span> <span class=\"k\">NOT<\/span> <span class=\"k\">NULL<\/span><span class=\"p\">,<\/span>\n  <span class=\"n\">updated_at<\/span> <span class=\"nb\">timestamp<\/span> <span class=\"k\">without<\/span> <span class=\"nb\">time<\/span> <span class=\"k\">zone<\/span> <span class=\"k\">DEFAULT<\/span> <span class=\"n\">timezone<\/span><span class=\"p\">(<\/span><span class=\"s1\">'utc'<\/span> <span class=\"p\">::<\/span> <span class=\"nb\">text<\/span><span class=\"p\">,<\/span> <span class=\"n\">now<\/span><span class=\"p\">())<\/span> <span class=\"k\">NOT<\/span> <span class=\"k\">NULL<\/span>\n<span class=\"p\">);<\/span>\n<\/code><\/pre>\n<\/div>\n<p><span class=\"tlid-translation translation\" lang=\"de\"><span class=\"\" title=\"\">Nun k\u00f6nnen wir damit in Store.js die createList-Methode erstellen, die wir aus index.js aufrufen:<br \/>\n<\/span><\/span><\/p>\n<div class=\"highlight\">\n<pre class=\"highlight jsx\"><code><span class=\"k\">export<\/span> <span class=\"kd\">const<\/span> <span class=\"nx\">createList<\/span> <span class=\"o\">=<\/span> <span class=\"k\">async<\/span> <span class=\"p\">(<\/span><span class=\"nx\">uuid<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n  <span class=\"k\">try<\/span> <span class=\"p\">{<\/span>\n    <span class=\"kd\">let<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">body<\/span> <span class=\"p\">}<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nx\">supabase<\/span><span class=\"p\">.<\/span><span class=\"k\">from<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">lists<\/span><span class=\"dl\">'<\/span><span class=\"p\">).<\/span><span class=\"nx\">insert<\/span><span class=\"p\">([{<\/span> <span class=\"nx\">uuid<\/span> <span class=\"p\">}])<\/span>\n    <span class=\"k\">return<\/span> <span class=\"nx\">body<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">]<\/span>\n  <span class=\"p\">}<\/span> <span class=\"k\">catch<\/span> <span class=\"p\">(<\/span><span class=\"nx\">error<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n    <span class=\"nx\">console<\/span><span class=\"p\">.<\/span><span class=\"nx\">log<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">error<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"nx\">error<\/span><span class=\"p\">)<\/span>\n  <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n<\/div>\n<p><a href=\"https:\/\/github.com\/smartDevel\/community-tasks\/blob\/master\/src\/Store.js\">Hier ist der Rest des Codes zu Store.js abrufbar<\/a>. Die anderen wichtigen Punkte in diesem Code sind<\/p>\n<pre class=\"highlight jsx\"><code>        <span class=\"nx\">supabase<\/span>\n          <span class=\"p\">.<\/span><span class=\"k\">from<\/span><span class=\"p\">(<\/span><span class=\"s2\">`tasks:list_id=eq.<\/span><span class=\"p\">${<\/span><span class=\"nx\">list<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span><span class=\"p\">}<\/span><span class=\"s2\">`<\/span><span class=\"p\">)<\/span>\n          <span class=\"p\">.<\/span><span class=\"nx\">on<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">INSERT<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"p\">(<\/span><span class=\"nx\">payload<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"nx\">handleNewTask<\/span><span class=\"p\">(<\/span><span class=\"nx\">payload<\/span><span class=\"p\">.<\/span><span class=\"k\">new<\/span><span class=\"p\">))<\/span>\n          <span class=\"p\">.<\/span><span class=\"nx\">on<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">UPDATE<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"p\">(<\/span><span class=\"nx\">payload<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"nx\">handleNewTask<\/span><span class=\"p\">(<\/span><span class=\"nx\">payload<\/span><span class=\"p\">.<\/span><span class=\"k\">new<\/span><span class=\"p\">))<\/span>\n          <span class=\"p\">.<\/span><span class=\"nx\">subscribe<\/span><span class=\"p\">()<\/span><\/code><\/pre>\n<p>und wie wir den <em>State<\/em> mit <code>useState ()<\/code> und <code>useEffect<\/code> verwalten.Das ist zun\u00e4chst nicht ganz einfach zu verstehen. Sehr hilfreich ist es daher unbedingt die Erl\u00e4uterung zum\u00a0 <a href=\"https:\/\/reactjs.org\/docs\/hooks-effect.html\" target=\"_blank\" rel=\"noopener noreferrer\">Effekt-Hook<\/a> durchzulesen, um zu verstehen, wie das alles zusammenpasst.<\/p>\n<h3>4) <a href=\"https:\/\/github.com\/smartDevel\/community-tasks\/blob\/master\/src\/TodoList.js\" target=\"_blank\" rel=\"noopener noreferrer\">TodoList.js<\/a><\/h3>\n<p>F\u00fcr die TodoList-Komponente importieren wir zun\u00e4chst aus dem Store:<\/p>\n<div class=\"highlight\">\n<pre class=\"highlight jsx\"><code><span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">useStore<\/span><span class=\"p\">,<\/span> <span class=\"nx\">addTask<\/span><span class=\"p\">,<\/span> <span class=\"nx\">updateTask<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">.\/Store<\/span><span class=\"dl\">'<\/span>\n<\/code><\/pre>\n<\/div>\n<p>und dann k\u00f6nnen wir diese\u00a0 wie \u00fcbliche State-Variablen verwenden:<\/p>\n<div>\n<pre>export\u00a0const\u00a0TodoList\u00a0=\u00a0(uuid)\u00a0=&gt;\u00a0{\n  const\u00a0[newTaskText,\u00a0setNewTaskText]\u00a0=\u00a0useState('')\n\u00a0\u00a0const\u00a0{\u00a0tasks,\u00a0setTasks,\u00a0list\u00a0}\u00a0=\u00a0useStore({\u00a0uuid\u00a0})\n\n\u00a0\u00a0return\u00a0(\n\u00a0\u00a0\u00a0\u00a0&lt;div\u00a0className=\"container\"&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;Link\u00a0to=\"\/\"&gt;Zur\u00fcck\/Neustart&lt;\/Link&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;h1\u00a0className=\"section\"&gt;\u270d??\u2728Community\u00a0Aufgabenliste\u2728?\u00a0\u2714\ufe0f&lt;\/h1&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;div\u00a0className=\"section\"&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;label&gt;Aufruf-Link\u00a0zum\u00a0Bearbeiten\u00a0und\u00a0Anzeigen:\u00a0&lt;\/label&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;input\u00a0className=\"inputField\"\u00a0type=\"text\"\u00a0readOnly\u00a0value={window.location.href}\u00a0\/&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/div&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;div\u00a0className={'field-row\u00a0section'}&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;form\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0onSubmit={(e)\u00a0=&gt;\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0e.preventDefault()\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0setNewTaskText('')\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}}\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;label&gt;Neue\u00a0Aufgabe\u00a0hier\u00a0eintragen\u00a0und\u00a0hinzuf\u00fcgen:\u00a0&lt;\/label&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;input\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0id=\"newtask\"\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0type=\"text\"\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0value={newTaskText}\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0onChange={(e)\u00a0=&gt;\u00a0setNewTaskText(e.target.value)}\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;button\u00a0type=\"submit\"\u00a0onClick={()\u00a0=&gt;\u00a0(newTaskText\u00a0?\u00a0addTask(newTaskText,\u00a0list.id)\u00a0:\u00a0'')}&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Aufgabe\u00a0hinzuf\u00fcgen\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/button&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/form&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/div&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;div\u00a0className=\"section\"&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{tasks\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0?\u00a0tasks.map((task)\u00a0=&gt;\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return\u00a0(\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;div\u00a0key={task.id}\u00a0className={'field-row'}&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;input\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0checked={task.complete\u00a0?\u00a0true\u00a0:\u00a0''}\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0onChange={(e)\u00a0=&gt;\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0tasks.find((t,\u00a0i)\u00a0=&gt;\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if\u00a0(t.id\u00a0===\u00a0task.id)\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0tasks[i].complete\u00a0=\u00a0!task.complete\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return\u00a0true\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0else\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return\u00a0false\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0})\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0setTasks([...tasks])\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0updateTask(task.id,\u00a0{\u00a0complete:\u00a0e.target.checked\u00a0})\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}}\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0type=\"checkbox\"\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0id={`task-${task.id}`}\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&gt;&lt;\/input&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;label\u00a0htmlFor={`task-${task.id}`}&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{task.complete\u00a0?\u00a0&lt;del&gt;{task.task_text}&lt;\/del&gt;\u00a0:\u00a0task.task_text}\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/label&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/div&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0})\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0:\u00a0''}\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/div&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;div\u00a0className=\"section\"&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;small&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Achtung:\u00a0Bitte\u00a0keine\u00a0sensiblen\u00a0Informationen\u00a0hier\u00a0eintragen,\u00a0da\u00a0die\u00a0Liste\u00a0\u00f6ffentlich\u00a0aufrufbar\u00a0und\u00a0einsehbar\u00a0ist\u00a0!\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/small&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/div&gt;\n\u00a0\u00a0\u00a0\u00a0&lt;\/div&gt;\n\u00a0\u00a0)\n}<\/pre>\n<p>Wenn wir alles soweit zum Laufen gebracht haben, sollten wir nun in der Lage sein, <code>npm run start<\/code> auszuf\u00fchren und im Browser die URL <code>localhost: 3000<\/code> aufzurufen, um die Anwendung in Action zu sehen.<\/p>\n<\/div>\n<div>Der komplette Source-Code ist in <a href=\"https:\/\/github.com\/smartDevel\/community-tasks\" target=\"_blank\" rel=\"noopener noreferrer\">gitHub frei verf\u00fcgbar.<\/a><\/div>\n<div>Die komplette <a href=\"https:\/\/supabase.io\/docs\" target=\"_blank\" rel=\"noopener noreferrer\">Dokumentation zu Supabase ist hier abrufbar.<\/a><\/div>\n<div><\/div>\n<div><em><strong>Haftungsausschluss\/ Wichtiger Hinweis ?\u26a1:<\/strong> <\/em><br \/>\nDiese Demo wird ohne Benutzerauthentifizierung geliefert. Der Zugriff auf die Liste eines anderen Benutzers ist ohne Kenntnis der uuid zwar nicht ganz einfach aber trotzdem grunds\u00e4tzlich m\u00f6glich. <strong>Daher ist davon auszugehen, dass alles, was in die Aufgabenlisten eingetragen wird, \u00f6ffentlich verf\u00fcgbare Informationen sind.<\/strong><\/div>\n<div><\/div>\n<p><\/p>\n<div style='text-align:left' class='yasr-auto-insert-overall'><\/div><div style='text-align:left' class='yasr-auto-insert-visitor'><\/div>","protected":false},"excerpt":{"rendered":"<p>Nachdem nun Wunderlist ja leider Geschichte ist wollen wir uns heute mal anschauen, wie man sich diesen &#8211; https:\/\/community-tasks.now.sh\/ &#8211; einfachen und kollaborativen Echtzeit-Tasklistendienst selbst&#8230;<\/p>\n<div class=\"more-link-wrapper\"><a class=\"more-link\" href=\"https:\/\/ways4.eu\/de\/blog\/2020\/06\/04\/how-to-kollaborative-aufgabenliste-in-react\/\">Weiterlesen<span class=\"screen-reader-text\">HowTo: Erstellen von kollaborativen Echtzeit-Aufgabenlisten in React<\/span><\/a><\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"redux-templates_contained","format":"standard","meta":{"_oct_exclude_from_cache":false,"_mi_skip_tracking":false,"yasr_overall_rating":0,"yasr_post_is_review":"","yasr_auto_insert_disabled":"","yasr_review_type":"BlogPosting","_wpoai_wizard_id":""},"categories":[115,23],"tags":[116],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.0 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>HowTo: Erstellen von kollaborativen Echtzeit-Aufgabenlisten in React -<\/title>\n<meta name=\"description\" content=\"HowTo: Erstellen von kollaborativen Echtzeit-Aufgabenlisten in React\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/ways4.eu\/blog\/2020\/06\/04\/how-to-kollaborative-aufgabenliste-in-react\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"[:de]HowTo: Erstellen von kollaborativen Echtzeit-Aufgabenlisten in React - [:]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/ways4.eu\/blog\/2020\/06\/04\/how-to-kollaborative-aufgabenliste-in-react\/\" \/>\n<meta property=\"og:site_name\" content=\"Streng vertraulich !\" \/>\n<meta property=\"article:published_time\" content=\"2020-06-04T06:42:18+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-01-13T19:40:36+00:00\" \/>\n<meta name=\"author\" content=\"pathfinder\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@sabhe011\" \/>\n<meta name=\"twitter:site\" content=\"@sabhe011\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"pathfinder\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"6\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/ways4.eu\/blog\/2020\/06\/04\/how-to-kollaborative-aufgabenliste-in-react\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/ways4.eu\/blog\/2020\/06\/04\/how-to-kollaborative-aufgabenliste-in-react\/\"},\"author\":{\"name\":\"pathfinder\",\"@id\":\"https:\/\/ways4.eu\/#\/schema\/person\/00041dcd2cf535a70052cf591c2abd81\"},\"headline\":\"HowTo: Erstellen von kollaborativen Echtzeit-Aufgabenlisten in React\",\"datePublished\":\"2020-06-04T06:42:18+00:00\",\"dateModified\":\"2022-01-13T19:40:36+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/ways4.eu\/blog\/2020\/06\/04\/how-to-kollaborative-aufgabenliste-in-react\/\"},\"wordCount\":629,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/ways4.eu\/#\/schema\/person\/00041dcd2cf535a70052cf591c2abd81\"},\"keywords\":[\"#react\"],\"articleSection\":[\"Coding\",\"Computers and IT\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/ways4.eu\/blog\/2020\/06\/04\/how-to-kollaborative-aufgabenliste-in-react\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/ways4.eu\/blog\/2020\/06\/04\/how-to-kollaborative-aufgabenliste-in-react\/\",\"url\":\"https:\/\/ways4.eu\/blog\/2020\/06\/04\/how-to-kollaborative-aufgabenliste-in-react\/\",\"name\":\"[:de]HowTo: Erstellen von kollaborativen Echtzeit-Aufgabenlisten in React - [:]\",\"isPartOf\":{\"@id\":\"https:\/\/ways4.eu\/#website\"},\"datePublished\":\"2020-06-04T06:42:18+00:00\",\"dateModified\":\"2022-01-13T19:40:36+00:00\",\"description\":\"{:de}HowTo: Erstellen von kollaborativen Echtzeit-Aufgabenlisten in React {:}\",\"breadcrumb\":{\"@id\":\"https:\/\/ways4.eu\/blog\/2020\/06\/04\/how-to-kollaborative-aufgabenliste-in-react\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/ways4.eu\/blog\/2020\/06\/04\/how-to-kollaborative-aufgabenliste-in-react\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/ways4.eu\/blog\/2020\/06\/04\/how-to-kollaborative-aufgabenliste-in-react\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/ways4.eu\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"(Deutsch) HowTo: Erstellen von kollaborativen Echtzeit-Aufgabenlisten in React\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/ways4.eu\/#website\",\"url\":\"https:\/\/ways4.eu\/\",\"name\":\"Streng vertraulich !\",\"description\":\"Nicht weitersagen...\",\"publisher\":{\"@id\":\"https:\/\/ways4.eu\/#\/schema\/person\/00041dcd2cf535a70052cf591c2abd81\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/ways4.eu\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"de\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/ways4.eu\/#\/schema\/person\/00041dcd2cf535a70052cf591c2abd81\",\"name\":\"pathfinder\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/ways4.eu\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/i0.wp.com\/www.ways4.eu\/wp-content\/uploads\/2023\/01\/wp-1674746983690.jpg?fit=702%2C841&ssl=1\",\"contentUrl\":\"https:\/\/i0.wp.com\/www.ways4.eu\/wp-content\/uploads\/2023\/01\/wp-1674746983690.jpg?fit=702%2C841&ssl=1\",\"width\":702,\"height\":841,\"caption\":\"pathfinder\"},\"logo\":{\"@id\":\"https:\/\/ways4.eu\/#\/schema\/person\/image\/\"},\"sameAs\":[\"https:\/\/ways4.eu\",\"https:\/\/twitter.com\/sabhe011\"],\"url\":\"https:\/\/ways4.eu\/de\/blog\/author\/pathfinder\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"HowTo: Erstellen von kollaborativen Echtzeit-Aufgabenlisten in React -","description":"HowTo: Erstellen von kollaborativen Echtzeit-Aufgabenlisten in React","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/ways4.eu\/blog\/2020\/06\/04\/how-to-kollaborative-aufgabenliste-in-react\/","og_locale":"de_DE","og_type":"article","og_title":"[:de]HowTo: Erstellen von kollaborativen Echtzeit-Aufgabenlisten in React - [:]","og_url":"https:\/\/ways4.eu\/blog\/2020\/06\/04\/how-to-kollaborative-aufgabenliste-in-react\/","og_site_name":"Streng vertraulich !","article_published_time":"2020-06-04T06:42:18+00:00","article_modified_time":"2022-01-13T19:40:36+00:00","author":"pathfinder","twitter_card":"summary_large_image","twitter_creator":"@sabhe011","twitter_site":"@sabhe011","twitter_misc":{"Verfasst von":"pathfinder","Gesch\u00e4tzte Lesezeit":"6\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/ways4.eu\/blog\/2020\/06\/04\/how-to-kollaborative-aufgabenliste-in-react\/#article","isPartOf":{"@id":"https:\/\/ways4.eu\/blog\/2020\/06\/04\/how-to-kollaborative-aufgabenliste-in-react\/"},"author":{"name":"pathfinder","@id":"https:\/\/ways4.eu\/#\/schema\/person\/00041dcd2cf535a70052cf591c2abd81"},"headline":"HowTo: Erstellen von kollaborativen Echtzeit-Aufgabenlisten in React","datePublished":"2020-06-04T06:42:18+00:00","dateModified":"2022-01-13T19:40:36+00:00","mainEntityOfPage":{"@id":"https:\/\/ways4.eu\/blog\/2020\/06\/04\/how-to-kollaborative-aufgabenliste-in-react\/"},"wordCount":629,"commentCount":0,"publisher":{"@id":"https:\/\/ways4.eu\/#\/schema\/person\/00041dcd2cf535a70052cf591c2abd81"},"keywords":["#react"],"articleSection":["Coding","Computers and IT"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/ways4.eu\/blog\/2020\/06\/04\/how-to-kollaborative-aufgabenliste-in-react\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/ways4.eu\/blog\/2020\/06\/04\/how-to-kollaborative-aufgabenliste-in-react\/","url":"https:\/\/ways4.eu\/blog\/2020\/06\/04\/how-to-kollaborative-aufgabenliste-in-react\/","name":"[:de]HowTo: Erstellen von kollaborativen Echtzeit-Aufgabenlisten in React - [:]","isPartOf":{"@id":"https:\/\/ways4.eu\/#website"},"datePublished":"2020-06-04T06:42:18+00:00","dateModified":"2022-01-13T19:40:36+00:00","description":"{:de}HowTo: Erstellen von kollaborativen Echtzeit-Aufgabenlisten in React {:}","breadcrumb":{"@id":"https:\/\/ways4.eu\/blog\/2020\/06\/04\/how-to-kollaborative-aufgabenliste-in-react\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/ways4.eu\/blog\/2020\/06\/04\/how-to-kollaborative-aufgabenliste-in-react\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/ways4.eu\/blog\/2020\/06\/04\/how-to-kollaborative-aufgabenliste-in-react\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/ways4.eu\/"},{"@type":"ListItem","position":2,"name":"(Deutsch) HowTo: Erstellen von kollaborativen Echtzeit-Aufgabenlisten in React"}]},{"@type":"WebSite","@id":"https:\/\/ways4.eu\/#website","url":"https:\/\/ways4.eu\/","name":"Streng vertraulich !","description":"Nicht weitersagen...","publisher":{"@id":"https:\/\/ways4.eu\/#\/schema\/person\/00041dcd2cf535a70052cf591c2abd81"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/ways4.eu\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"de"},{"@type":["Person","Organization"],"@id":"https:\/\/ways4.eu\/#\/schema\/person\/00041dcd2cf535a70052cf591c2abd81","name":"pathfinder","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/ways4.eu\/#\/schema\/person\/image\/","url":"https:\/\/i0.wp.com\/www.ways4.eu\/wp-content\/uploads\/2023\/01\/wp-1674746983690.jpg?fit=702%2C841&ssl=1","contentUrl":"https:\/\/i0.wp.com\/www.ways4.eu\/wp-content\/uploads\/2023\/01\/wp-1674746983690.jpg?fit=702%2C841&ssl=1","width":702,"height":841,"caption":"pathfinder"},"logo":{"@id":"https:\/\/ways4.eu\/#\/schema\/person\/image\/"},"sameAs":["https:\/\/ways4.eu","https:\/\/twitter.com\/sabhe011"],"url":"https:\/\/ways4.eu\/de\/blog\/author\/pathfinder\/"}]}},"yasr_visitor_votes":{"number_of_votes":0,"sum_votes":0,"stars_attributes":{"read_only":false,"span_bottom":false}},"_links":{"self":[{"href":"https:\/\/ways4.eu\/de\/wp-json\/wp\/v2\/posts\/2056"}],"collection":[{"href":"https:\/\/ways4.eu\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ways4.eu\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ways4.eu\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/ways4.eu\/de\/wp-json\/wp\/v2\/comments?post=2056"}],"version-history":[{"count":35,"href":"https:\/\/ways4.eu\/de\/wp-json\/wp\/v2\/posts\/2056\/revisions"}],"predecessor-version":[{"id":2155,"href":"https:\/\/ways4.eu\/de\/wp-json\/wp\/v2\/posts\/2056\/revisions\/2155"}],"wp:attachment":[{"href":"https:\/\/ways4.eu\/de\/wp-json\/wp\/v2\/media?parent=2056"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ways4.eu\/de\/wp-json\/wp\/v2\/categories?post=2056"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ways4.eu\/de\/wp-json\/wp\/v2\/tags?post=2056"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}