Our great sponsors
-
SurveyJS
Open-Source JSON Form Builder to Create Dynamic Forms Right in Your App. With SurveyJS form UI libraries, you can build and style forms in a fully-integrated drag & drop form builder, render them in your JS app, and store form submission data in any backend, inc. PHP, ASP.NET Core, and Node.js.
For the complete source code, check out this GitHub repository.
This project is completed and written in Vue.js. Vue is an open-source JavaScript front-end framework for building user interfaces and single-page applications with HTML, CSS, and JavaScript.
We also added scoped styles using the tags for the component.
Next, we import the Blog component to the root component
App.vue
.
<template> <div class="container"> <Blog /> </div> </template> <script> import Blog from '@/components/Blog.vue'; export default { name: 'App', components: { Blog, }; </script> <style> [component styles go in here] </style>
Enter fullscreen mode Exit fullscreen modeHere’s the complete code snippet of the home page.
https://gist.github.com/Chuloo/c6d23d0b7503228b553df180067c2e43
The blog comments page looks like this now:
Creating the comment input forms
Next, we create input fields with which readers can enter comments.
In the components folder, we create a new file,
AddComment.vue
, with the following content:
<template> <div class="form"> <form> <div class="form__group"> <label>Leave a comment</label> <textarea v-model="newComment" rows="10" required cols="50" placeholder="type in your comment" /> <button>Submit</button> </div> </form> </div> </template> <script> export default { data() { return { newComment: '', }; }, }; </script> <style scoped> .form { margin-top: 1.5em; } label { display: block; margin-bottom: 1em; font-weight: 700; font-family: Padauk, sans-serif; } textarea { width: 100%; margin-top: 0.5em; } button { border: unset; background: #79b791; color: #230c0f; font-weight: 700; padding: 1em 2.5em; margin-top: 1em; } </style>
Enter fullscreen mode Exit fullscreen modeThe code above has a data property
newComment
set to an empty string. This property is bound to the</code> field using the v-model directive.</p> <p>With this in place, let's import the <code>AddComment</code> component into the <code>App.vue</code> component with the following code:<br> </p> <div class="highlight js-code-highlight"> <pre class="highlight javascript"><code> <span class="o"><</span><span class="nx">template</span><span class="o">></span> <span class="o"><</span><span class="nx">div</span> <span class="kd">class</span><span class="o">=</span><span class="dl">"</span><span class="s2">container</span><span class="dl">"</span><span class="o">></span> <span class="o"><</span><span class="nx">Blog</span> <span class="o">/></span> <span class="c"><!--</span> <span class="nx">add</span> <span class="k">this</span> <span class="o">--></span> <span class="o"><</span><span class="nx">add</span><span class="o">-</span><span class="nx">comment</span> <span class="o">/></span> <span class="o"><</span><span class="sr">/div</span><span class="err">> </span> <span class="o"><</span><span class="sr">/template</span><span class="err">> </span> <span class="o"><</span><span class="nx">script</span><span class="o">></span> <span class="c1">// other import component</span> <span class="k">import</span> <span class="nx">AddComment</span> <span class="k">from</span> <span class="dl">'</span><span class="s1">@/components/AddComment.vue</span><span class="dl">'</span><span class="p">;</span> <span class="c1">// add this</span> <span class="k">export</span> <span class="k">default</span> <span class="p">{</span> <span class="na">name</span><span class="p">:</span> <span class="dl">'</span><span class="s1">App</span><span class="dl">'</span><span class="p">,</span> <span class="na">components</span><span class="p">:</span> <span class="p">{</span> <span class="c1">// blog component</span> <span class="nx">AddComment</span> <span class="c1">// add this</span> <span class="p">};</span> <span class="o"><</span><span class="sr">/script</span><span class="err">> </span> <span class="o"><</span><span class="nx">style</span><span class="o">></span> <span class="cm">/* styles for the page */</span> <span class="o"><</span><span class="sr">/style</span><span class="err">> </span></code></pre> <div class="highlight__panel js-actions-panel"> <div class="highlight__panel-action js-fullscreen-code-action"> <svg xmlns="http://www.w3.org/2000/svg" width="20px" height="20px" viewbox="0 0 24 24" class="highlight-action crayons-icon highlight-action--fullscreen-on"><title>Enter fullscreen mode</title> <path d="M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z"></path> </svg> <svg xmlns="http://www.w3.org/2000/svg" width="20px" height="20px" viewbox="0 0 24 24" class="highlight-action crayons-icon highlight-action--fullscreen-off"><title>Exit fullscreen mode</title> <path d="M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z"></path> </svg> </div> </div> </div> <p>The result of the blog should look like this:</p> <p><a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4tbaFXuG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://paper-attachments.dropbox.com/s_D7CBE305335ABA15AC2578F5A659EF2A343B08496D251D5A83784758220481C8_1648510552616_image.png" class="article-body-image-wrapper"><img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4tbaFXuG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://paper-attachments.dropbox.com/s_D7CBE305335ABA15AC2578F5A659EF2A343B08496D251D5A83784758220481C8_1648510552616_image.png" alt="text input area blog" loading="lazy" width="880" height="476"></a></p> <p>Next, we will list all comments created under a post. We will also include options to update or delete a comment.</p> <p>We create a file, <code>Comment.vue</code>, in the components folder with the following content:<br> </p> <div class="highlight js-code-highlight"> <pre class="highlight javascript"><code> <span class="o"><</span><span class="nx">template</span><span class="o">></span> <span class="o"><</span><span class="nx">div</span> <span class="kd">class</span><span class="o">=</span><span class="dl">"</span><span class="s2">comment</span><span class="dl">"</span><span class="o">></span> <span class="o"><</span><span class="nx">div</span> <span class="kd">class</span><span class="o">=</span><span class="dl">"</span><span class="s2">comment__flex</span><span class="dl">"</span><span class="o">></span> <span class="o"><</span><span class="nx">p</span><span class="o">></span><span class="nx">I</span> <span class="nx">found</span> <span class="k">this</span> <span class="nx">article</span> <span class="nx">helpful</span><span class="o"><</span><span class="sr">/p</span><span class="err">> </span> <span class="o"><</span><span class="nx">div</span> <span class="kd">class</span><span class="o">=</span><span class="dl">"</span><span class="s2">comment__flex-btn</span><span class="dl">"</span><span class="o">></span> <span class="o"><</span><span class="nx">button</span> <span class="kd">class</span><span class="o">=</span><span class="dl">"</span><span class="s2">update</span><span class="dl">"</span><span class="o">></span><span class="nx">Update</span><span class="o"><</span><span class="sr">/button</span><span class="err">> </span> <span class="o"><</span><span class="nx">button</span> <span class="kd">class</span><span class="o">=</span><span class="dl">"</span><span class="s2">del</span><span class="dl">"</span><span class="o">></span><span class="nx">Delete</span><span class="o"><</span><span class="sr">/button</span><span class="err">> </span> <span class="o"><</span><span class="sr">/div</span><span class="err">> </span> <span class="o"><</span><span class="sr">/div</span><span class="err">> </span> <span class="o"><</span><span class="sr">/div</span><span class="err">> </span> <span class="o"><</span><span class="sr">/template</span><span class="err">> </span> <span class="o"><</span><span class="nx">style</span><span class="o">></span> <span class="p">[</span><span class="nx">Styles</span> <span class="nx">go</span> <span class="k">in</span> <span class="nx">here</span><span class="p">]</span> <span class="o"><</span><span class="sr">/style</span><span class="err">> </span></code></pre> <div class="highlight__panel js-actions-panel"> <div class="highlight__panel-action js-fullscreen-code-action"> <svg xmlns="http://www.w3.org/2000/svg" width="20px" height="20px" viewbox="0 0 24 24" class="highlight-action crayons-icon highlight-action--fullscreen-on"><title>Enter fullscreen mode</title> <path d="M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z"></path> </svg> <svg xmlns="http://www.w3.org/2000/svg" width="20px" height="20px" viewbox="0 0 24 24" class="highlight-action crayons-icon highlight-action--fullscreen-off"><title>Exit fullscreen mode</title> <path d="M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z"></path> </svg> </div> </div> </div> <p>You can see the complete component with styles in <a href="https://gist.github.com/Chuloo/0edc8d42d8c69221b6cac39eafa93204">this gist</a>.</p> <p><a href="https://gist.github.com/Chuloo/0edc8d42d8c69221b6cac39eafa93204">https://gist.github.com/Chuloo/0edc8d42d8c69221b6cac39eafa93204</a></p> <p>Finally, let's include the <code>Comment</code> component in the <code>App.vue</code> file.<br> </p> <div class="highlight js-code-highlight"> <pre class="highlight javascript"><code> <span class="o"><</span><span class="nx">template</span><span class="o">></span> <span class="o"><</span><span class="nx">div</span> <span class="kd">class</span><span class="o">=</span><span class="dl">"</span><span class="s2">container</span><span class="dl">"</span><span class="o">></span> <span class="o"><</span><span class="nx">Blog</span> <span class="o">/></span> <span class="c"><!--</span> <span class="nx">add</span> <span class="k">this</span> <span class="o">--></span> <span class="o"><</span><span class="nx">div</span> <span class="kd">class</span><span class="o">=</span><span class="dl">"</span><span class="s2">comment-space</span><span class="dl">"</span><span class="o">></span> <span class="o"><</span><span class="nx">p</span><span class="o">></span><span class="nx">Comment</span> <span class="p">(</span><span class="mi">1</span><span class="p">)</span><span class="o"><</span><span class="sr">/p</span><span class="err">> </span> <span class="o"><</span><span class="sr">/div</span><span class="err">> </span> <span class="o"><</span><span class="nx">div</span><span class="o">></span> <span class="o"><</span><span class="nx">comment</span> <span class="kd">class</span><span class="o">=</span><span class="dl">"</span><span class="s2">message</span><span class="dl">"</span> <span class="o">/></span> <span class="o"><</span><span class="sr">/div</span><span class="err">> </span> <span class="o"><</span><span class="nx">add</span><span class="o">-</span><span class="nx">comment</span> <span class="o">/></span> <span class="o"><</span><span class="sr">/div</span><span class="err">> </span> <span class="o"><</span><span class="sr">/template</span><span class="err">> </span> <span class="o"><</span><span class="nx">script</span><span class="o">></span> <span class="c1">// other import component</span> <span class="k">import</span> <span class="nx">Comment</span> <span class="k">from</span> <span class="dl">'</span><span class="s1">@/components/Comment</span><span class="dl">'</span><span class="p">;</span> <span class="k">export</span> <span class="k">default</span> <span class="p">{</span> <span class="na">name</span><span class="p">:</span> <span class="dl">'</span><span class="s1">App</span><span class="dl">'</span><span class="p">,</span> <span class="na">components</span><span class="p">:</span> <span class="p">{</span> <span class="c1">// other components</span> <span class="nx">Comment</span> <span class="c1">// add this</span> <span class="p">},</span> <span class="p">};</span> <span class="o"><</span><span class="sr">/script</span><span class="err">> </span></code></pre> <div class="highlight__panel js-actions-panel"> <div class="highlight__panel-action js-fullscreen-code-action"> <svg xmlns="http://www.w3.org/2000/svg" width="20px" height="20px" viewbox="0 0 24 24" class="highlight-action crayons-icon highlight-action--fullscreen-on"><title>Enter fullscreen mode</title> <path d="M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z"></path> </svg> <svg xmlns="http://www.w3.org/2000/svg" width="20px" height="20px" viewbox="0 0 24 24" class="highlight-action crayons-icon highlight-action--fullscreen-off"><title>Exit fullscreen mode</title> <path d="M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z"></path> </svg> </div> </div> </div> <p>All the data on the page is static, and the page looks like the image below.</p> <p><a href="https://res.cloudinary.com/practicaldev/image/fetch/s--eUcUW_7a--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://paper-attachments.dropbox.com/s_D7CBE305335ABA15AC2578F5A659EF2A343B08496D251D5A83784758220481C8_1648512532977_image.png" class="article-body-image-wrapper"><img src="https://res.cloudinary.com/practicaldev/image/fetch/s--eUcUW_7a--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://paper-attachments.dropbox.com/s_D7CBE305335ABA15AC2578F5A659EF2A343B08496D251D5A83784758220481C8_1648512532977_image.png" alt="blog" loading="lazy" width="880" height="541"></a></p> <p>Next, we’ll add interactivity to the page.</p> <h2> <a name="appwrite-project-setup" href="#appwrite-project-setup"> </a> Appwrite project setup </h2> <p>To use Appwrite in this Vue application, we install the Appwrite client-side SDK with the command.</p> <div class="highlight js-code-highlight"> <pre class="highlight plaintext"><code>yarn add appwrite # or npm install appwrite </code></pre> <div class="highlight__panel js-actions-panel"> <div class="highlight__panel-action js-fullscreen-code-action"> <svg xmlns="http://www.w3.org/2000/svg" width="20px" height="20px" viewbox="0 0 24 24" class="highlight-action crayons-icon highlight-action--fullscreen-on"><title>Enter fullscreen mode</title> <path d="M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z"></path> </svg> <svg xmlns="http://www.w3.org/2000/svg" width="20px" height="20px" viewbox="0 0 24 24" class="highlight-action crayons-icon highlight-action--fullscreen-off"><title>Exit fullscreen mode</title> <path d="M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z"></path> </svg> </div> </div> </div> <p>Next, let's set up the app by creating a new Appwrite project.</p> <h2> <a name="create-a-new-appwrite-project" href="#create-a-new-appwrite-project"> </a> Create a new Appwrite Project </h2> <p>We click the Create Project button to start a new project on our Appwrite web console (either local or hosted).</p> <p>After that, we obtain the <code>Project ID</code> and <code>API Endpoint</code> in the project's settings tab.</p> <p>In the project’s root directory, we create a utils.js file to define a new Appwrite instance and other helpful application variables.<br> </p> <div class="highlight js-code-highlight"> <pre class="highlight javascript"><code> <span class="k">import</span> <span class="p">{</span> <span class="nx">Appwrite</span> <span class="p">}</span> <span class="k">from</span> <span class="dl">'</span><span class="s1">appwrite</span><span class="dl">'</span><span class="p">;</span> <span class="c1">// Init your Web SDK</span> <span class="kd">const</span> <span class="nx">appwrite</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Appwrite</span><span class="p">();</span> <span class="nx">appwrite</span> <span class="p">.</span><span class="nx">setEndpoint</span><span class="p">(</span><span class="dl">'</span><span class="s1">http://EndpointURL.example</span><span class="dl">'</span><span class="p">)</span> <span class="c1">// Replace this with your endpoint</span> <span class="p">.</span><span class="nx">setProject</span><span class="p">(</span><span class="dl">'</span><span class="s1">ProjectID</span><span class="dl">'</span><span class="p">);</span> <span class="c1">// Replace this with your ProjectID</span> <span class="nx">appwrite</span><span class="p">.</span><span class="nx">account</span><span class="p">.</span><span class="nx">createAnonymousSession</span><span class="p">().</span><span class="nx">then</span><span class="p">(</span> <span class="p">(</span><span class="nx">response</span><span class="p">)</span> <span class="o">=></span> <span class="p">{</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">response</span><span class="p">);</span> <span class="p">},</span> <span class="p">(</span><span class="nx">error</span><span class="p">)</span> <span class="o">=></span> <span class="p">{</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">error</span><span class="p">);</span> <span class="p">}</span> <span class="p">);</span> <span class="k">export</span> <span class="kd">const</span> <span class="nx">db</span> <span class="o">=</span> <span class="nx">appwrite</span><span class="p">.</span><span class="nx">database</span><span class="p">;</span> <span class="k">export</span> <span class="kd">const</span> <span class="nx">COLLECTION_ID</span> <span class="o">=</span> <span class="dl">'</span><span class="s1">COLLECTION ID</span><span class="dl">'</span><span class="p">;</span> <span class="c1">// Replace with your Collection ID</span> </code></pre> <div class="highlight__panel js-actions-panel"> <div class="highlight__panel-action js-fullscreen-code-action"> <svg xmlns="http://www.w3.org/2000/svg" width="20px" height="20px" viewbox="0 0 24 24" class="highlight-action crayons-icon highlight-action--fullscreen-on"><title>Enter fullscreen mode</title> <path d="M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z"></path> </svg> <svg xmlns="http://www.w3.org/2000/svg" width="20px" height="20px" viewbox="0 0 24 24" class="highlight-action crayons-icon highlight-action--fullscreen-off"><title>Exit fullscreen mode</title> <path d="M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z"></path> </svg> </div> </div> </div> <p>To bypass some security requirements, we created an anonymous session on Appwrite.</p> <h2> <a name="creating-the-database-collection" href="#creating-the-database-collection"> </a> Creating the database collection </h2> <p>Appwrite provides a functional database with which we will store our blog comments.</p> <p>To create a collection in our Appwrite console panel, we navigate to the Database tab, click the <em>Add Collection</em> button, and provide a collection name. We copy the <code>CollectionID</code> as we require it to interact with the collection using the client-side SDK.</p> <p>At the <code>Collection Level</code> within the <code>settings</code> tab, we set the Read and Write access to have the value of <code>role:all</code>.</p> <p><a href="https://res.cloudinary.com/practicaldev/image/fetch/s--2lbZuyh3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://paper-attachments.dropbox.com/s_D7CBE305335ABA15AC2578F5A659EF2A343B08496D251D5A83784758220481C8_1648518488594_image.png" class="article-body-image-wrapper"><img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2lbZuyh3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://paper-attachments.dropbox.com/s_D7CBE305335ABA15AC2578F5A659EF2A343B08496D251D5A83784758220481C8_1648518488594_image.png" alt="blog" loading="lazy" width="880" height="409"></a></p> <p>Update the data in <code>utils.js</code> to include the Appwrite credentials obtained.</p> <p>Finally, in the attributes tab, let's create the properties for our documents. For this application, we store the comment and date of each comment.</p> <p><a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9Yg1miJT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://paper-attachments.dropbox.com/s_D7CBE305335ABA15AC2578F5A659EF2A343B08496D251D5A83784758220481C8_1648518852144_image.png" class="article-body-image-wrapper"><img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9Yg1miJT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://paper-attachments.dropbox.com/s_D7CBE305335ABA15AC2578F5A659EF2A343B08496D251D5A83784758220481C8_1648518852144_image.png" alt="blog comment" loading="lazy" width="880" height="470"></a></p> <h2> <a name="fetch-all-comments" href="#fetch-all-comments"> </a> Fetch all comments </h2> <p>We require a function to fetch all comments when the app loads. We do this in the <code>script</code> portion of <code>App.vue</code> with:<br> </p> <div class="highlight js-code-highlight"> <pre class="highlight javascript"><code> <span class="o"><</span><span class="nx">script</span><span class="o">></span> <span class="k">import</span> <span class="p">{</span> <span class="nx">COLLECTION_ID</span><span class="p">,</span> <span class="nx">db</span> <span class="p">}</span> <span class="k">from</span> <span class="dl">'</span><span class="s1">@/utils</span><span class="dl">'</span><span class="p">;</span> <span class="k">export</span> <span class="k">default</span> <span class="p">{</span> <span class="na">name</span><span class="p">:</span> <span class="dl">'</span><span class="s1">App</span><span class="dl">'</span><span class="p">,</span> <span class="na">components</span><span class="p">:</span> <span class="p">{</span> <span class="c1">// all components</span> <span class="p">},</span> <span class="nx">created</span><span class="p">()</span> <span class="p">{</span> <span class="k">this</span><span class="p">.</span><span class="nx">fetchComments</span><span class="p">();</span> <span class="p">},</span> <span class="nx">data</span><span class="p">()</span> <span class="p">{</span> <span class="k">return</span> <span class="p">{</span> <span class="na">comments</span><span class="p">:</span> <span class="p">[],</span> <span class="p">};</span> <span class="p">},</span> <span class="na">methods</span><span class="p">:</span> <span class="p">{</span> <span class="nx">fetchComments</span><span class="p">()</span> <span class="p">{</span> <span class="kd">let</span> <span class="nx">promise</span> <span class="o">=</span> <span class="nx">db</span><span class="p">.</span><span class="nx">listDocuments</span><span class="p">(</span><span class="nx">COLLECTION_ID</span><span class="p">);</span> <span class="nx">promise</span><span class="p">.</span><span class="nx">then</span><span class="p">(</span> <span class="p">(</span><span class="nx">res</span><span class="p">)</span> <span class="o">=></span> <span class="p">{</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">res</span><span class="p">);</span> <span class="k">this</span><span class="p">.</span><span class="nx">comments</span> <span class="o">=</span> <span class="nx">res</span><span class="p">.</span><span class="nx">documents</span><span class="p">;</span> <span class="p">},</span> <span class="p">(</span><span class="nx">err</span><span class="p">)</span> <span class="o">=></span> <span class="p">{</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">err</span><span class="p">);</span> <span class="p">}</span> <span class="p">);</span> <span class="p">},</span> <span class="p">},</span> <span class="p">};</span> <span class="o"><</span><span class="sr">/script</span><span class="err">> </span></code></pre> <div class="highlight__panel js-actions-panel"> <div class="highlight__panel-action js-fullscreen-code-action"> <svg xmlns="http://www.w3.org/2000/svg" width="20px" height="20px" viewbox="0 0 24 24" class="highlight-action crayons-icon highlight-action--fullscreen-on"><title>Enter fullscreen mode</title> <path d="M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z"></path> </svg> <svg xmlns="http://www.w3.org/2000/svg" width="20px" height="20px" viewbox="0 0 24 24" class="highlight-action crayons-icon highlight-action--fullscreen-off"><title>Exit fullscreen mode</title> <path d="M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z"></path> </svg> </div> </div> </div> <p>We created the comments array in the <code>data()</code> function to store comments we retrieve using the <code>listDocuments</code> API.</p> <p>In the <code>created()</code> lifecycle method, run the <code>fetchComments()</code> function when the App component is created.</p> <p>We update the HTML in the <code><template></code> section of the <code>App.vue</code> component with the following.<br> </p> <div class="highlight js-code-highlight"> <pre class="highlight javascript"><code><span class="o"><</span><span class="nx">template</span><span class="o">></span> <span class="o"><</span><span class="nx">div</span> <span class="kd">class</span><span class="o">=</span><span class="dl">"</span><span class="s2">container</span><span class="dl">"</span><span class="o">></span> <span class="o"><</span><span class="nx">Blog</span> <span class="o">/></span> <span class="o"><</span><span class="nx">div</span> <span class="kd">class</span><span class="o">=</span><span class="dl">"</span><span class="s2">comment-space</span><span class="dl">"</span><span class="o">></span> <span class="o"><</span><span class="nx">p</span><span class="o">></span> <span class="p">{{</span> <span class="nx">comments</span><span class="p">.</span><span class="nx">length</span> <span class="o">></span> <span class="mi">1</span> <span class="p">?</span> <span class="s2">`Comments (</span><span class="p">${</span><span class="nx">comments</span><span class="p">.</span><span class="nx">length</span><span class="p">}</span><span class="s2">)`</span> <span class="p">:</span> <span class="nx">comments</span><span class="p">.</span><span class="nx">length</span> <span class="o">==</span> <span class="mi">1</span> <span class="p">?</span> <span class="s2">`Comment (</span><span class="p">${</span><span class="nx">comments</span><span class="p">.</span><span class="nx">length</span><span class="p">}</span><span class="s2">)`</span> <span class="p">:</span> <span class="dl">''</span> <span class="p">}}</span> <span class="o"><</span><span class="sr">/p</span><span class="err">> </span> <span class="o"><</span><span class="sr">/div</span><span class="err">> </span> <span class="o"><</span><span class="nx">div</span> <span class="nx">v</span><span class="o">-</span><span class="k">for</span><span class="o">=</span><span class="dl">"</span><span class="s2">data in comments</span><span class="dl">"</span> <span class="p">:</span><span class="nx">key</span><span class="o">=</span><span class="dl">"</span><span class="s2">data.comment</span><span class="dl">"</span><span class="o">></span> <span class="c"><!--</span> <span class="nx">comment</span> <span class="nx">component</span> <span class="nx">goes</span> <span class="nx">here</span> <span class="o">--></span> <span class="o"><</span><span class="sr">/div</span><span class="err">> </span> <span class="o"><</span><span class="nx">add</span><span class="o">-</span><span class="nx">comment</span> <span class="p">:</span><span class="nx">fetchComments</span><span class="o">=</span><span class="dl">"</span><span class="s2">fetchComments</span><span class="dl">"</span> <span class="o">/></span> <span class="o"><</span><span class="sr">/div</span><span class="err">> </span> <span class="o"><</span><span class="sr">/template</span><span class="err">> </span></code></pre> <div class="highlight__panel js-actions-panel"> <div class="highlight__panel-action js-fullscreen-code-action"> <svg xmlns="http://www.w3.org/2000/svg" width="20px" height="20px" viewbox="0 0 24 24" class="highlight-action crayons-icon highlight-action--fullscreen-on"><title>Enter fullscreen mode</title> <path d="M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z"></path> </svg> <svg xmlns="http://www.w3.org/2000/svg" width="20px" height="20px" viewbox="0 0 24 24" class="highlight-action crayons-icon highlight-action--fullscreen-off"><title>Exit fullscreen mode</title> <path d="M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z"></path> </svg> </div> </div> </div> <p>The <code><p></code> tag contains a ternary operator that shows the number of comments. Using the <code>v-for</code> directive, we loop through and render each comment.</p> <p>To reuse the function to fetch all comments after creating a new comment, we bind the <code>:fetchComments</code> prop to the fetchComments method we defined earlier.</p> <h2> <a name="creating-a-blog-comment" href="#creating-a-blog-comment"> </a> Creating a blog comment </h2> <p>We move to the <code>AddComment.vue</code> file to handle a comment’s addition to the database.<br> </p> <div class="highlight js-code-highlight"> <pre class="highlight javascript"><code> <span class="o"><</span><span class="nx">template</span><span class="o">></span> <span class="o"><</span><span class="nx">div</span> <span class="kd">class</span><span class="o">=</span><span class="dl">"</span><span class="s2">form</span><span class="dl">"</span><span class="o">></span> <span class="o"><</span><span class="nx">form</span> <span class="p">@</span><span class="nd">submit</span><span class="p">.</span><span class="nx">prevent</span><span class="o">=</span><span class="dl">"</span><span class="s2">createNewComment</span><span class="dl">"</span><span class="o">></span> <span class="o"><</span><span class="nx">div</span> <span class="kd">class</span><span class="o">=</span><span class="dl">"</span><span class="s2">form__group</span><span class="dl">"</span><span class="o">></span> <span class="o"><</span><span class="nx">label</span><span class="o">></span><span class="nx">Leave</span> <span class="nx">a</span> <span class="nx">comment</span><span class="o"><</span><span class="sr">/label</span><span class="err">> </span> <span class="o"><</span><span class="nx">textarea</span> <span class="nx">v</span><span class="o">-</span><span class="nx">model</span><span class="o">=</span><span class="dl">"</span><span class="s2">newComment</span><span class="dl">"</span> <span class="nx">rows</span><span class="o">=</span><span class="dl">"</span><span class="s2">10</span><span class="dl">"</span> <span class="nx">required</span> <span class="nx">cols</span><span class="o">=</span><span class="dl">"</span><span class="s2">50</span><span class="dl">"</span> <span class="nx">placeholder</span><span class="o">=</span><span class="dl">"</span><span class="s2">type in your comment</span><span class="dl">"</span> <span class="o">/></span> <span class="o"><</span><span class="nx">button</span><span class="o">></span><span class="nx">Submit</span><span class="o"><</span><span class="sr">/button</span><span class="err">> </span> <span class="o"><</span><span class="sr">/div</span><span class="err">> </span> <span class="o"><</span><span class="sr">/form</span><span class="err">> </span> <span class="o"><</span><span class="sr">/div</span><span class="err">> </span> <span class="o"><</span><span class="sr">/template</span><span class="err">> </span> <span class="o"><</span><span class="nx">script</span><span class="o">></span> <span class="k">import</span> <span class="p">{</span> <span class="nx">COLLECTION_ID</span><span class="p">,</span> <span class="nx">db</span> <span class="p">}</span> <span class="k">from</span> <span class="dl">'</span><span class="s1">@/utils</span><span class="dl">'</span><span class="p">;</span> <span class="k">export</span> <span class="k">default</span> <span class="p">{</span> <span class="na">props</span><span class="p">:</span> <span class="p">[</span><span class="dl">'</span><span class="s1">fetchComments</span><span class="dl">'</span><span class="p">],</span> <span class="c1">// data ()</span> <span class="na">methods</span><span class="p">:</span> <span class="p">{</span> <span class="nx">createNewComment</span><span class="p">()</span> <span class="p">{</span> <span class="k">if</span> <span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">newComment</span> <span class="o">===</span> <span class="dl">''</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span><span class="p">;</span> <span class="p">}</span> <span class="kd">let</span> <span class="nx">promise</span> <span class="o">=</span> <span class="nx">db</span><span class="p">.</span><span class="nx">createDocument</span><span class="p">(</span><span class="nx">COLLECTION_ID</span><span class="p">,</span> <span class="dl">'</span><span class="s1">unique()</span><span class="dl">'</span><span class="p">,</span> <span class="p">{</span> <span class="na">comment</span><span class="p">:</span> <span class="k">this</span><span class="p">.</span><span class="nx">newComment</span><span class="p">,</span> <span class="na">date</span><span class="p">:</span> <span class="k">new</span> <span class="nb">Date</span><span class="p">(),</span> <span class="p">});</span> <span class="nx">promise</span><span class="p">.</span><span class="nx">then</span><span class="p">(</span> <span class="p">()</span> <span class="o">=></span> <span class="p">{</span> <span class="k">this</span><span class="p">.</span><span class="nx">fetchComments</span><span class="p">();</span> <span class="k">this</span><span class="p">.</span><span class="nx">newComment</span> <span class="o">=</span> <span class="dl">''</span><span class="p">;</span> <span class="p">},</span> <span class="p">(</span><span class="nx">err</span><span class="p">)</span> <span class="o">=></span> <span class="p">{</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">err</span><span class="p">);</span> <span class="p">}</span> <span class="p">);</span> <span class="p">},</span> <span class="p">},</span> <span class="p">};</span> <span class="o"><</span><span class="sr">/script</span><span class="err">> </span></code></pre> <div class="highlight__panel js-actions-panel"> <div class="highlight__panel-action js-fullscreen-code-action"> <svg xmlns="http://www.w3.org/2000/svg" width="20px" height="20px" viewbox="0 0 24 24" class="highlight-action crayons-icon highlight-action--fullscreen-on"><title>Enter fullscreen mode</title> <path d="M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z"></path> </svg> <svg xmlns="http://www.w3.org/2000/svg" width="20px" height="20px" viewbox="0 0 24 24" class="highlight-action crayons-icon highlight-action--fullscreen-off"><title>Exit fullscreen mode</title> <path d="M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z"></path> </svg> </div> </div> </div> <p>In the createNewComment method, we use Appwrite’s createDocument API to write a new comment to the database. An error message is logged if the write operation fails. We fetch an updated list of all comments after adding a new comment. </p> <p>The Appwrite web console will display one document representing a comment in the image below:</p> <p><a href="https://res.cloudinary.com/practicaldev/image/fetch/s--NDPw8xMg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://paper-attachments.dropbox.com/s_D7CBE305335ABA15AC2578F5A659EF2A343B08496D251D5A83784758220481C8_1648544339183_image.png" class="article-body-image-wrapper"><img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NDPw8xMg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://paper-attachments.dropbox.com/s_D7CBE305335ABA15AC2578F5A659EF2A343B08496D251D5A83784758220481C8_1648544339183_image.png" alt="blog" loading="lazy" width="880" height="533"></a></p> <h2> <a name="updating-the-comment-list-component" href="#updating-the-comment-list-component"> </a> Updating the Comment list Component </h2> <p>In the App.vue component, we update the <code>comment</code> component’s props to include the comment data and the <code>fetchComments</code> method.<br> </p> <div class="highlight js-code-highlight"> <pre class="highlight javascript"><code><span class="o"><</span><span class="nx">template</span><span class="o">></span> <span class="o"><</span><span class="nx">div</span> <span class="kd">class</span><span class="o">=</span><span class="dl">"</span><span class="s2">container</span><span class="dl">"</span><span class="o">></span> <span class="o"><-!--</span> <span class="nx">Blog</span> <span class="nx">component</span> <span class="o">--></span> <span class="o"><-!--</span> <span class="nx">Comment</span> <span class="nx">count</span> <span class="o">--></span> <span class="o"><</span><span class="nx">div</span> <span class="nx">v</span><span class="o">-</span><span class="k">for</span><span class="o">=</span><span class="dl">"</span><span class="s2">data in comments</span><span class="dl">"</span> <span class="p">:</span><span class="nx">key</span><span class="o">=</span><span class="dl">"</span><span class="s2">data.comment</span><span class="dl">"</span><span class="o">></span> <span class="o"><-!--</span> <span class="nx">add</span> <span class="k">this</span> <span class="o">--></span> <span class="o"><</span><span class="nx">comment</span> <span class="kd">class</span><span class="o">=</span><span class="dl">"</span><span class="s2">message</span><span class="dl">"</span> <span class="p">:</span><span class="nx">data</span><span class="o">=</span><span class="dl">"</span><span class="s2">data</span><span class="dl">"</span> <span class="nx">v</span><span class="o">-</span><span class="nx">on</span><span class="p">:</span><span class="nx">refreshData</span><span class="o">=</span><span class="dl">"</span><span class="s2">fetchComments</span><span class="dl">"</span> <span class="o">/></span> <span class="o"><</span><span class="sr">/div</span><span class="err">> </span> <span class="o"><-!--</span> <span class="nx">add</span><span class="o">-</span><span class="nx">comment</span> <span class="nx">component</span> <span class="o">--></span> <span class="o"><</span><span class="sr">/div</span><span class="err">> </span> <span class="o"><</span><span class="sr">/template</span><span class="err">> </span> <span class="o"><</span><span class="nx">script</span><span class="o">></span> <span class="c1">// import component</span> <span class="k">import</span> <span class="nx">Comment</span> <span class="k">from</span> <span class="dl">'</span><span class="s1">@/components/Comment</span><span class="dl">'</span><span class="p">;</span> <span class="k">export</span> <span class="k">default</span> <span class="p">{</span> <span class="na">components</span><span class="p">:</span> <span class="p">{</span> <span class="c1">// other components</span> <span class="nx">Comment</span><span class="p">,</span> <span class="p">},</span> <span class="p">};</span> <span class="o"><</span><span class="sr">/script</span><span class="err">> </span></code></pre> <div class="highlight__panel js-actions-panel"> <div class="highlight__panel-action js-fullscreen-code-action"> <svg xmlns="http://www.w3.org/2000/svg" width="20px" height="20px" viewbox="0 0 24 24" class="highlight-action crayons-icon highlight-action--fullscreen-on"><title>Enter fullscreen mode</title> <path d="M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z"></path> </svg> <svg xmlns="http://www.w3.org/2000/svg" width="20px" height="20px" viewbox="0 0 24 24" class="highlight-action crayons-icon highlight-action--fullscreen-off"><title>Exit fullscreen mode</title> <path d="M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z"></path> </svg> </div> </div> </div> <p><code>fetchComments</code> runs once the <code>refreshData</code> event is fired.</p> <p>Let's update the <code>Comment.vue</code> component to handle comment updates and deletion. We will also include a component to edit a comment. First, we add the update comment function in the script portion with:<br> </p> <div class="highlight js-code-highlight"> <pre class="highlight javascript"><code><span class="o"><</span><span class="nx">script</span><span class="o">></span> <span class="k">import</span> <span class="p">{</span> <span class="nx">db</span> <span class="p">}</span> <span class="k">from</span> <span class="dl">'</span><span class="s1">@/utils</span><span class="dl">'</span><span class="p">;</span> <span class="k">export</span> <span class="k">default</span> <span class="p">{</span> <span class="na">props</span><span class="p">:</span> <span class="p">[</span><span class="dl">'</span><span class="s1">data</span><span class="dl">'</span><span class="p">],</span> <span class="nx">data</span><span class="p">()</span> <span class="p">{</span> <span class="k">return</span> <span class="p">{</span> <span class="na">open</span><span class="p">:</span> <span class="kc">false</span><span class="p">,</span> <span class="na">displayedComment</span><span class="p">:</span> <span class="dl">''</span><span class="p">,</span> <span class="p">};</span> <span class="p">},</span> <span class="na">methods</span><span class="p">:</span> <span class="p">{</span> <span class="nx">updateComment</span><span class="p">()</span> <span class="p">{</span> <span class="k">this</span><span class="p">.</span><span class="nx">open</span> <span class="o">=</span> <span class="o">!</span><span class="k">this</span><span class="p">.</span><span class="nx">open</span><span class="p">;</span> <span class="p">},</span> <span class="nx">updateCommentMethod</span><span class="p">()</span> <span class="p">{</span> <span class="kd">let</span> <span class="nx">promise</span> <span class="o">=</span> <span class="nx">db</span><span class="p">.</span><span class="nx">updateDocument</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">data</span><span class="p">.</span><span class="nx">$collection</span><span class="p">,</span> <span class="k">this</span><span class="p">.</span><span class="nx">data</span><span class="p">.</span><span class="nx">$id</span><span class="p">,</span> <span class="p">{</span> <span class="na">comment</span><span class="p">:</span> <span class="k">this</span><span class="p">.</span><span class="nx">displayedComment</span><span class="p">,</span> <span class="p">});</span> <span class="k">this</span><span class="p">.</span><span class="nx">open</span> <span class="o">=</span> <span class="kc">false</span><span class="p">;</span> <span class="nx">promise</span><span class="p">.</span><span class="nx">then</span><span class="p">(</span> <span class="p">()</span> <span class="o">=></span> <span class="p">{</span> <span class="k">this</span><span class="p">.</span><span class="nx">$emit</span><span class="p">(</span><span class="dl">'</span><span class="s1">refreshData</span><span class="dl">'</span><span class="p">);</span> <span class="p">},</span> <span class="p">(</span><span class="nx">err</span><span class="p">)</span> <span class="o">=></span> <span class="p">{</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">err</span><span class="p">);</span> <span class="p">}</span> <span class="p">);</span> <span class="p">},</span> <span class="p">},</span> <span class="p">};</span> <span class="o"><</span><span class="sr">/script</span><span class="err">> </span></code></pre> <div class="highlight__panel js-actions-panel"> <div class="highlight__panel-action js-fullscreen-code-action"> <svg xmlns="http://www.w3.org/2000/svg" width="20px" height="20px" viewbox="0 0 24 24" class="highlight-action crayons-icon highlight-action--fullscreen-on"><title>Enter fullscreen mode</title> <path d="M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z"></path> </svg> <svg xmlns="http://www.w3.org/2000/svg" width="20px" height="20px" viewbox="0 0 24 24" class="highlight-action crayons-icon highlight-action--fullscreen-off"><title>Exit fullscreen mode</title> <path d="M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z"></path> </svg> </div> </div> </div> <p>We added a state variable to manage the visibility of a comment’s action buttons and another variable to hold the new text. Appwrite’s <code>updateDocument</code> API uses the collection ID and document ID passed as props to update the comment. Once the comment is updated, we emit the <code>refreshData</code> event to fetch all comments.</p> <p>We update the template portion to utilize the methods and variables created.<br> </p> <div class="highlight js-code-highlight"> <pre class="highlight javascript"><code><span class="o"><</span><span class="nx">template</span><span class="o">></span> <span class="o"><</span><span class="nx">div</span> <span class="kd">class</span><span class="o">=</span><span class="dl">"</span><span class="s2">comment</span><span class="dl">"</span><span class="o">></span> <span class="o"><</span><span class="nx">div</span> <span class="kd">class</span><span class="o">=</span><span class="dl">"</span><span class="s2">comment__flex</span><span class="dl">"</span><span class="o">></span> <span class="o"><</span><span class="nx">p</span><span class="o">></span><span class="p">{{</span> <span class="nx">data</span><span class="p">.</span><span class="nx">comment</span> <span class="p">}}</span><span class="o"><</span><span class="sr">/p</span><span class="err">> </span> <span class="o"><</span><span class="nx">div</span> <span class="kd">class</span><span class="o">=</span><span class="dl">"</span><span class="s2">comment__flex-btn</span><span class="dl">"</span><span class="o">></span> <span class="o"><</span><span class="nx">button</span> <span class="kd">class</span><span class="o">=</span><span class="dl">"</span><span class="s2">update</span><span class="dl">"</span> <span class="p">@</span><span class="nd">click</span><span class="o">=</span><span class="dl">"</span><span class="s2">updateComment</span><span class="dl">"</span><span class="o">></span><span class="nx">Update</span><span class="o"><</span><span class="sr">/button</span><span class="err">> </span> <span class="o"><</span><span class="nx">button</span> <span class="kd">class</span><span class="o">=</span><span class="dl">"</span><span class="s2">del</span><span class="dl">"</span> <span class="p">@</span><span class="nd">click</span><span class="o">=</span><span class="dl">"</span><span class="s2">deleteComment</span><span class="dl">"</span><span class="o">></span><span class="nx">Delete</span><span class="o"><</span><span class="sr">/button</span><span class="err">> </span> <span class="o"><</span><span class="sr">/div</span><span class="err">> </span> <span class="o"><</span><span class="sr">/div</span><span class="err">> </span> <span class="o"><</span><span class="nx">div</span> <span class="nx">v</span><span class="o">-</span><span class="k">if</span><span class="o">=</span><span class="dl">"</span><span class="s2">this.open</span><span class="dl">"</span> <span class="kd">class</span><span class="o">=</span><span class="dl">"</span><span class="s2">open</span><span class="dl">"</span><span class="o">></span> <span class="o"><</span><span class="nx">form</span> <span class="p">@</span><span class="nd">submit</span><span class="p">.</span><span class="nx">prevent</span><span class="o">=</span><span class="dl">"</span><span class="s2">updateCommentMethod</span><span class="dl">"</span><span class="o">></span> <span class="o"><</span><span class="nx">div</span> <span class="kd">class</span><span class="o">=</span><span class="dl">"</span><span class="s2">form-group</span><span class="dl">"</span><span class="o">></span> <span class="o"><</span><span class="nx">textarea</span> <span class="nx">cols</span><span class="o">=</span><span class="dl">"</span><span class="s2">50</span><span class="dl">"</span> <span class="nx">rows</span><span class="o">=</span><span class="dl">"</span><span class="s2">10</span><span class="dl">"</span> <span class="nx">id</span> <span class="nx">required</span> <span class="p">:</span><span class="nx">placeholder</span><span class="o">=</span><span class="dl">"</span><span class="s2">data.comment</span><span class="dl">"</span> <span class="nx">v</span><span class="o">-</span><span class="nx">model</span><span class="o">=</span><span class="dl">"</span><span class="s2">displayedComment</span><span class="dl">"</span> <span class="o">/></span> <span class="o"><</span><span class="nx">button</span> <span class="kd">class</span><span class="o">=</span><span class="dl">"</span><span class="s2">update</span><span class="dl">"</span><span class="o">></span><span class="nx">Update</span><span class="o"><</span><span class="sr">/button</span><span class="err">> </span> <span class="o"><</span><span class="sr">/div</span><span class="err">> </span> <span class="o"><</span><span class="sr">/form</span><span class="err">> </span> <span class="o"><</span><span class="sr">/div</span><span class="err">> </span> <span class="o"><</span><span class="sr">/div</span><span class="err">> </span> <span class="o"><</span><span class="sr">/template</span><span class="err">> </span></code></pre> <div class="highlight__panel js-actions-panel"> <div class="highlight__panel-action js-fullscreen-code-action"> <svg xmlns="http://www.w3.org/2000/svg" width="20px" height="20px" viewbox="0 0 24 24" class="highlight-action crayons-icon highlight-action--fullscreen-on"><title>Enter fullscreen mode</title> <path d="M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z"></path> </svg> <svg xmlns="http://www.w3.org/2000/svg" width="20px" height="20px" viewbox="0 0 24 24" class="highlight-action crayons-icon highlight-action--fullscreen-off"><title>Exit fullscreen mode</title> <path d="M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z"></path> </svg> </div> </div> </div> <p>Lastly, we add a method to delete a comment using Appwrite’s <code>deleteDocument</code> API.<br> </p> <div class="highlight js-code-highlight"> <pre class="highlight javascript"><code><span class="o"><</span><span class="nx">script</span><span class="o">></span> <span class="k">export</span> <span class="k">default</span> <span class="p">{</span> <span class="na">methods</span><span class="p">:</span> <span class="p">{</span> <span class="nx">deleteComment</span><span class="p">()</span> <span class="p">{</span> <span class="kd">let</span> <span class="nx">promise</span> <span class="o">=</span> <span class="nx">db</span><span class="p">.</span><span class="nx">deleteDocument</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">data</span><span class="p">.</span><span class="nx">$collection</span><span class="p">,</span> <span class="k">this</span><span class="p">.</span><span class="nx">data</span><span class="p">.</span><span class="nx">$id</span><span class="p">);</span> <span class="nx">promise</span><span class="p">.</span><span class="nx">then</span><span class="p">(</span> <span class="p">()</span> <span class="o">=></span> <span class="p">{</span> <span class="k">this</span><span class="p">.</span><span class="nx">$emit</span><span class="p">(</span><span class="dl">'</span><span class="s1">refreshData</span><span class="dl">'</span><span class="p">);</span> <span class="p">},</span> <span class="p">(</span><span class="nx">err</span><span class="p">)</span> <span class="o">=></span> <span class="p">{</span> <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 occured</span><span class="dl">'</span><span class="p">,</span> <span class="nx">err</span><span class="p">);</span> <span class="p">}</span> <span class="p">);</span> <span class="p">},</span> <span class="p">}</span> <span class="p">}</span> <span class="o"><</span><span class="sr">/script</span><span class="err">> </span></code></pre> <div class="highlight__panel js-actions-panel"> <div class="highlight__panel-action js-fullscreen-code-action"> <svg xmlns="http://www.w3.org/2000/svg" width="20px" height="20px" viewbox="0 0 24 24" class="highlight-action crayons-icon highlight-action--fullscreen-on"><title>Enter fullscreen mode</title> <path d="M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z"></path> </svg> <svg xmlns="http://www.w3.org/2000/svg" width="20px" height="20px" viewbox="0 0 24 24" class="highlight-action crayons-icon highlight-action--fullscreen-off"><title>Exit fullscreen mode</title> <path d="M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z"></path> </svg> </div> </div> </div> <p>The image below is the final look of the web page.</p> <p><a href="https://res.cloudinary.com/practicaldev/image/fetch/s--tnr6Rh7D--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://paper-attachments.dropbox.com/s_D7CBE305335ABA15AC2578F5A659EF2A343B08496D251D5A83784758220481C8_1648552941268_image.png" class="article-body-image-wrapper"><img src="https://res.cloudinary.com/practicaldev/image/fetch/s--tnr6Rh7D--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://paper-attachments.dropbox.com/s_D7CBE305335ABA15AC2578F5A659EF2A343B08496D251D5A83784758220481C8_1648552941268_image.png" alt="blog" loading="lazy" width="880" height="540"></a></p> <h2> <a name="conclusion" href="#conclusion"> </a> Conclusion </h2> <p>This post is an in-depth guide on using Appwrite to create, display, edit, and delete blog comments. As seen, this feature doesn’t require a custom backend server. Try to add more blog posts and create unique comments for each.</p> <h2> <a name="learn-more" href="#learn-more"> </a> Learn More </h2> <ul> <li><a href="https://appwrite.io/docs/client/database">Appwrite CRUD operations</a></li> <li><a href="https://appwrite.io/docs/getting-started-for-web">Getting started with Appwrite</a></li> <li><a href="https://appwrite.io/docs/sdks">Appwrite SDKs</a></li> </ul>