vue小案例--簡易評論區

来源:https://www.cnblogs.com/l-y-h/archive/2019/10/10/11647918.html
-Advertisement-
Play Games

一、小案例(評論區) 1、流程 (1)分析靜態頁面。(vue項目創建參考https://www.cnblogs.com/l-y-h/p/11241503.html)(2)拆分靜態頁面,變成一個個組件。(3)對組件編碼,生成動態頁面。 2、靜態頁面 參考來源:https://www.bilibili. ...


一、小案例(評論區)

1、流程

(1)分析靜態頁面。(vue項目創建參考https://www.cnblogs.com/l-y-h/p/11241503.html)
(2)拆分靜態頁面,變成一個個組件。
(3)對組件編碼,生成動態頁面。

2、靜態頁面

參考來源:https://www.bilibili.com/video/av49099807/?p=22&t=1223

【舉例:】
<!DOCTYPE html>
<html>

    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width,initial-scale=1.0">
        <!--此處如果bootstrap選用 4.3.1的版本,樣式會無效(沒去研究)-->
        <link href="https://cdn.bootcss.com/twitter-bootstrap/3.3.7/css/bootstrap.css" rel="stylesheet">
        <script src="https://cdn.bootcss.com/twitter-bootstrap/3.3.7/js/bootstrap.js"></script>
        <title>vue_demo</title>
    </head>

    <body>
        <div id="app">
            <div>
                <!--頭部-->
                <header class="site-header jumbotron">
                    <div class="container">
                        <div class="row">
                            <div class="col-xs-12">
                                <h1>歡迎來到吐槽大廳</h1>
                            </div>
                        </div>
                    </div>
                </header>

                <!--主體部分-->
                <!--bootstrap將頁面分為12格,此處拆分為左4格,右8格-->
                <div class="container">
                    <div class="col-md-4">
                        <form action="form-horizontal">
                            <div class="form-group">
                                <label>用戶名</label>
                                <input type="text" class="form-control" placeholder="用戶名">
                            </div>
                            <div class="form-group">
                                <label>吐槽內容</label>
                                <textarea type="text" class="form-control" placeholder="吐槽內容"></textarea>
                            </div>
                            <div class="form-group">
                                <div class="col-sm-offset-2 col-sm-10">
                                    <button type="button" class="btn btn-default pull-right">提交</button>
                                </div>
                            </div>
                        </form>
                    </div>
                    <!--md4 for Add end    -->

                    <div class="col-md-8">
                        <h3 class="reply">吐槽回覆:</h3>
                        <h2>暫無吐槽,點擊左側添加吐槽吧!</h2>
                        <ul class="list-group">
                            <li class="list-group-item">
                                <div class="handle col-sm-offset-2 col-sm-10">
                                    <a class="pull-right">刪除</a>
                                </div>
                                <p class="user"><span>Tom</span><span>說:</span></p>
                            </li>
                            <li class="list-group-item">
                                <div class="handle col-sm-offset-2 col-sm-10">
                                    <a class="pull-right">刪除</a>
                                </div>
                                <p class="user"><span>Tom</span><span>說:</span></p>
                            </li>
                        </ul>
                    </div>
                    <!--md8 for List end -->
                </div>
            </div>
        </div>
        <!--app -->
    </body>

</html>

 

頁面截圖:

 

 

 

3、拆分靜態頁面,

拆分靜態頁面,使其變成一個個靜態組件。

Step1:是一個大的組件(App),裡面包含各種組件。

Step2:頁面內容可以拆分成 提交吐槽組件(Comment),吐槽回覆組件(Comments)。

Step3:吐槽回覆組件裡面 可以對 每一條吐槽進行拆分,即每個吐槽為一個組件(Item)。

 

 

 

文件結構如下:

 

 

 

【主要文件與文件夾:】
index.html    主頁面,所有組件操作均為其服務,在此處引入css、js文件
main.js       vue入口文件,從此處啟動vue
App.vue       App.vue組件,項目的入口組件
components      裡面保存各個小組件


【index.html】
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width,initial-scale=1.0">
    <link rel="icon" href="<%= BASE_URL %>favicon.ico">
    <!--所有組件都是為index.html服務的,所以在此處引入css、js文件-->
    <link href="https://cdn.bootcss.com/twitter-bootstrap/3.3.7/css/bootstrap.css" rel="stylesheet">
    <title>vuedemo</title>
  </head>
  <body>
    <noscript>
      <strong>We're sorry but vuedemo doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
    </noscript>
    <div id="app"></div>
    <!-- built files will be auto injected -->
  </body>
</html>


【main.js】
import Vue from 'vue'
import App from './App.vue'

Vue.config.productionTip = false

new Vue({
  render: h => h(App),
}).$mount('#app')


【App.vue】
<template>
    <div>
        <!--頭部-->
        <header class="site-header jumbotron">
            <div class="container">
                <div class="row">
                    <div class="col-xs-12">
                        <h1>歡迎來到吐槽大廳</h1>
                    </div>
                </div>
            </div>
        </header>

        <!--主體部分-->
        <!--bootstrap將頁面分為12格,此處拆分為左4格,右8格-->
        <div class="container">
            <!--使用各組件-->
            <Comment></Comment>
            <Comments></Comments>
        </div>
    </div>
    <!--App -->
</template>

<script>
    // 引入各組件
    import Comment from './components/Comment.vue'
    import Comments from './components/Comments.vue'

    export default {
        name: 'app',
        // 註冊各組件
        components: {
            Comment,
            Comments
        }
    }
</script>

<style>
</style>


【Comment.vue】
<template>
    <div class="col-md-4">
        <form action="form-horizontal">
            <div class="form-group">
                <label>用戶名</label>
                <input type="text" class="form-control" placeholder="用戶名">
            </div>
            <div class="form-group">
                <label>吐槽內容</label>
                <textarea type="text" class="form-control" placeholder="吐槽內容"></textarea>
            </div>
            <div class="form-group">
                <div class="col-sm-offset-2 col-sm-10">
                    <button type="button" class="btn btn-default pull-right">提交</button>
                </div>
            </div>
        </form>
    </div>
    <!--Comment -->
</template>

<script>
    export default{
        name: 'comment'
    }
</script>

<style>

</style>


【Comments.vue】
<template>
    <div class="col-md-8">
        <h3 class="reply">吐槽回覆:</h3>
        <h2>暫無吐槽,點擊左側添加吐槽吧!</h2>
        <ul class="list-group">
            <Item></Item>
        </ul>
    </div>
    <!--md8 for List end -->
</template>

<script>
    import Item from './Item.vue'
    
    export default{
        name: 'comments',
        components: {
            Item
        }
    }
</script>

<style>

</style>


【Item.vue】
<template>
    <!--註意,需要使用div包裹,否則會報錯-->
    <div>
        <li class="list-group-item">
            <div class="handle col-sm-offset-2 col-sm-10">
                <a class="pull-right">刪除</a>
            </div>
            <p class="user"><span>Tom</span><span>說:</span></p>
        </li>
        <li class="list-group-item">
            <div class="handle col-sm-offset-2 col-sm-10">
                <a class="pull-right">刪除</a>
            </div>
            <p class="user"><span>Tom</span><span>說:</span></p>
        </li>
    </div>
</template>

<script>
    export default{
        name: 'item'
    }
</script>

<style>

</style>

 

拆分後效果與原靜態頁面一致。

 

 

 

 

4、組件間值的傳遞(組件間通信)

  靜態頁面上吐槽區的內容不會是寫好的,是動態生成的,那麼如何生成,就涉及到組件間的值的傳遞。通過props 來聲明屬性,使用data來傳遞數據(屬性值),使用 v-bind 綁定屬性。

【對上面代碼進行修改】
App.vue              獲取數據,將數據往吐槽區(Comments.vue)傳
Comments.vue         接收App.vue傳來的數據,將每條數據往Item.vue傳
Item.vue             接收Comments.vue傳來的數據並顯示

要是一眼看不出來,可以下載個Bcompare軟體,自行比較一下代碼間的區別。

【App.vue】
<template>
    <div>
        <!--頭部-->
        <header class="site-header jumbotron">
            <div class="container">
                <div class="row">
                    <div class="col-xs-12">
                        <h1>歡迎來到吐槽大廳</h1>
                    </div>
                </div>
            </div>
        </header>

        <!--主體部分-->
        <!--bootstrap將頁面分為12格,此處拆分為左4格,右8格-->
        <div class="container">
            <!--使用各組件-->
            <Comment></Comment>
                   <!--需使用v-bind綁定屬性-->
            <Comments :contents="contents"></Comments>
        </div>
    </div>
    <!--App -->
</template>

<script>
    // 引入各組件
    import Comment from './components/Comment.vue'
    import Comments from './components/Comments.vue'

    export default {
        name: 'app',
        // 註冊各組件
        components: {
            Comment,
            Comments
        },
        
        // 傳遞數據
        data(){
            return {
                contents:[
                    {name: 'tom', content: '媽媽,我想吃烤山藥'},
                    {name: 'jarry', content: '吃,吃大塊的'},
                    {name: 'jarry', content: '兩塊夠不'},
                    {name: 'tom', content: '夠了,媽媽真好,謝謝媽媽'},
                ]
            }
        }
    }
</script>

<style>
</style>


【Comments.vue】
<template>
    <div class="col-md-8">
        <h3 class="reply">吐槽回覆:</h3>
        <ul class="list-group">
            <Item v-for="(content, index) in contents" :key="index" :content="content"></Item>
        </ul>
    </div>
    <!--md8 for List end -->
</template>

<script>
    import Item from './Item.vue'
    
    export default{
        name: 'comments',
        // 聲明接收屬性,此屬性可以在該組件中使用
        props: ['contents'],  // 只指定屬性名
        
        // 註冊組件
        components: {
            Item
        }
    }
</script>

<style>

</style>


【Item.vue】
<template>
    <!--註意,需要使用div包裹,否則會報錯-->
    <div>
        <li class="list-group-item">
            <div class="handle col-sm-offset-2 col-sm-10">
                <a class="pull-right">刪除</a>
            </div>
            <p class="user"><span style="font-size: 18px;">{{content.name}}</span><span style="font-size: 18px;">說:</span>{{content.content}}</p>
        </li>
    </div>
</template>

<script>
    export default{
        name: 'item',
        props: {
            // 指定屬性名以及屬性值的類型
            content : Object
         }
    }
</script>

<style>

</style>

效果如下圖:

 

 

 

5、動態交互--添加

  實現添加吐槽操作。

  使用v-on 綁定事件,使用v-model 實現數據的雙向綁定,方法也可以使用 v-bind 綁定 併進行組件通信。

【對上面代碼進行修改】
App.vue            定義增加吐槽的方法,並作為屬性傳遞給Comment.vue組件
Comment.vue        接收屬性,並定義添加數據的事件

【App.vue】
<template>
    <div>
        <!--頭部-->
        <header class="site-header jumbotron">
            <div class="container">
                <div class="row">
                    <div class="col-xs-12">
                        <h1>歡迎來到吐槽大廳</h1>
                    </div>
                </div>
            </div>
        </header>

        <!--主體部分-->
        <!--bootstrap將頁面分為12格,此處拆分為左4格,右8格-->
        <div class="container">
            <!--使用各組件-->
            <Comment :addComment="addComment"></Comment>
            	   

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一.同步和非同步的概念。 同步:即按代碼的順序執行任務。 在下列代碼中,按照同步概念,則是先列印1後列印2。 非同步:即執行一個任務的同時執行另一個任務。如果按照此概念執行上面代碼,則是同時列印出1和2。 二.客戶端JavaScript中代碼的執行順序 首先,不管是核心JavaScript還是客戶端Ja ...
  • ```html console.log('%c',CSS樣式)輸出css樣式 console.log('%s',字元串) 字元串格式化 %d%i 整數格式化; console.log('%o',節點) 可擴展的dom節點格式化,可擴展的javascript對象格式化 ``` ...
  • 來源:https://www.cnblogs.com/hellman/p/10683492.html在上面的來源基礎上增加頁碼顯示,自適應單雙頁PC端效果: 移動端展示: 源碼下載地址:http://www.luanxin.top/index.php/archives/30/ ...
  • HTTPS http超文本傳輸協議,所以的東西都是明文傳輸,容易被攔截,被攻擊,我們希望能對通話內容進行加密,那麼因此而生,出現了https https:在http的基礎上新增加了SSL層 先放圖 // http 超文本傳輸協議// https 加密的超文本傳輸協議 // 對稱加密瀏覽器生成一個秘鑰 ...
  • [TOC] HTML(上) 瀏覽器 瀏覽器也是一個客戶端 瀏覽器不通過服務端也可以渲染文本 HTML 什麼是HTML HTML全稱HyperText Markup Language,超文本標記語言,是一種描述性的標記語言。 超文本:音頻、視頻、圖片 標記:稱為標記,一個HTML頁面都是由各種標記組成 ...
  • 原文地址 "http://www.liulongbin.top:8085" 0. 基礎要求 1. 瞭解常見的 ES6 新特性 + ES6 的導入導出語法 + 解構賦值 + 箭頭函數 + etc... 2. 瞭解 vue 2.x 的基本使用 + 組件 + 常用的指令 + 生命周期函數 + comput ...
  • Node.js的crypto模塊提供了一組包括對OpenSSL的哈希、HMAC、加密、解密、簽名,以及驗證等一整套功能的封裝。具體的使用方法可以參考這篇文章中的描述:node.js_crypto模塊。 本文重點介紹在使用createCipheriv方法時所遇到的坑。對應的解密演算法createDeci ...
  • 1. 在IE8中整個頁面都打不開,一般情況是: 頁面組件中最後一個屬性出現了逗號 沒有多餘的逗號,就很有可能是組件中沒有設置renderTo:Ext.getBody(); 2. 頁面按鈕顏色失效 自定義css,更改按鈕顏色即可 3. 頁面視窗上下層級錯亂 在點擊的window屬性中添加alwaysO ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...