Implement quick blog comments in VueJS

This page summarizes the projects mentioned and recommended in the original post on dev.to

Our great sponsors
  • SurveyJS - Open-Source JSON Form Builder to Create Dynamic Forms Right in Your App
  • InfluxDB - Power Real-Time Data Analytics at Scale
  • WorkOS - The modern identity platform for B2B SaaS
  • appwrite-blog-comments-with-vue

    Quick blog comments in Vue.js and using Appwrite for storing data

  • For the complete source code, check out this GitHub repository.

  • Vue.js

    This is the repo for Vue 2. For Vue 3, go to https://github.com/vuejs/core

  • 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.

  • 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.

    SurveyJS logo
  • Appwrite

    Build like a team of hundreds_

  • 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 mode

    Here’s the complete code snippet of the home page.

    https://gist.github.com/Chuloo/c6d23d0b7503228b553df180067c2e43

    The blog comments page looks like this now:

    home page text

    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 mode

    The 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>

NOTE: The number of mentions on this list indicates mentions on common posts plus user suggested alternatives. Hence, a higher number means a more popular project.

Suggest a related project

Related posts