Home Web Front-end Front-end Q&A How to implement a simple chat list with Vue

How to implement a simple chat list with Vue

Apr 13, 2023 am 10:46 AM

With the continuous popularity of social networks and instant messaging, the chat function has also become one of the essential functions of various applications. In the field of front-end development, it is a common practice to use the Vue framework to implement chat lists. This article will introduce how to use Vue to implement a simple chat list.

1. Project construction

First, we need to use the Vue scaffolding tool to build a Vue project. Enter the following code into the command line:

vue create chat-app

This will create a Vue project named "chat-app". Next, we need to install some necessary dependencies, including Vue, Vue Router, Axios and Bootstrap. Enter the following code in the command line:

npm install vue vue-router axios bootstrap

2. Create a route

Create a "router.js" file in the "src" folder in the project root directory. The code is as follows:

import Vue from 'vue';
import VueRouter from 'vue-router';
import ChatList from './components/ChatList.vue';
import ChatRoom from './components/ChatRoom.vue';

Vue.use(VueRouter);

const routes = [
  {
    path: '/',
    name: 'ChatList',
    component: ChatList
  },
  {
    path: '/chat-room/:id',
    name: 'ChatRoom',
    component: ChatRoom,
    props: true
  }
];

const router = new VueRouter({
  mode: 'history',
  base: process.env.BASE_URL,
  routes
});

export default router;

Here we have created two routes, one is the chat list page under the "/" path, and the other is the chat room page under the "/chat-room/:id" path. We will explain the implementation of these components one by one below.

3. Create a chat list component

Create a "ChatList.vue" file in the "src/components" folder in the project root directory. The code is as follows:

<template>
  <div>
    <h1>聊天列表</h1>
    <ul class="list-group">
      <li v-for="(user, index) in users" :key="index" class="list-group-item" @click="goToChatRoom(user.id)">
        {{ user.name }}
      </li>
    </ul>
  </div>
</template>

<script>
import axios from 'axios';

export default {
  name: 'ChatList',
  data() {
    return {
      users: []
    };
  },
  created() {
    this.getUsers();
  },
  methods: {
    getUsers() {
      axios.get('https://jsonplaceholder.typicode.com/users').then(response => {
        this.users = response.data;
      });
    },
    goToChatRoom(id) {
      this.$router.push({ name: 'ChatRoom', params: { id } });
    }
  }
};
</script>

In this component, we use Vue's "v-for" directive to traverse the user list obtained from "https://jsonplaceholder.typicode.com/users" and add it to Rendered to the chat list page. When the user clicks on a list item, we trigger a "goToChatRoom" method, which navigates to the corresponding chat room page.

4. Create a chat room component

Create a "ChatRoom.vue" file in the "src/components" folder in the project root directory. The code is as follows:

<template>
  <div>
    <h1>{{ currentChatUser.name }}</h1>
    <ul class="list-group">
      <li v-for="(message, index) in messages" :key="index" class="list-group-item">
        <strong>{{ message.sender }}:</strong> {{ message.content }}
      </li>
    </ul>
    <form @submit.prevent="sendMessage">
      <div class="form-group">
        <input v-model="newMessage" type="text" class="form-control" placeholder="请输入消息内容">
      </div>
      <button type="submit" class="btn btn-primary">发送消息</button>
    </form>
  </div>
</template>

<script>
import axios from 'axios';

export default {
  name: 'ChatRoom',
  props: ['id'],
  data() {
    return {
      currentChatUser: {},
      messages: [],
      newMessage: ''
    };
  },
  created() {
    this.getCurrentChatUser();
    this.getMessages();
  },
  methods: {
    getCurrentChatUser() {
      axios.get(`https://jsonplaceholder.typicode.com/users/${this.id}`).then(response => {
        this.currentChatUser = response.data;
      });
    },
    getMessages() {
      axios.get(`https://jsonplaceholder.typicode.com/posts?userId=${this.id}`).then(response => {
        this.messages = response.data.map(message => {
          return { sender: this.currentChatUser.name, content: message.title };
        });
      });
    },
    sendMessage() {
      this.messages.push({ sender: '我', content: this.newMessage });
      this.newMessage = '';
    }
  }
};
</script>

In this component, we obtain the chat objects and message list of the current chat room and render them into the page. We also added a form that allows users to send new messages.

5. Test

Finally, run the following command in the project root directory to start the development server:

npm run serve

Open the browser and visit "http://localhost:8080" , you can see the chat list page we just created!

Click on the list item to start chatting on the new page!

6. Summary

This article introduces how to use the Vue framework to build a simple chat list. We use Axios to get remote data and render it into the page. Although this is just a simple example, it shows how to use routing and components in Vue to implement a personalized chat application. I hope this article can be helpful to Vue beginners.

The above is the detailed content of How to implement a simple chat list with Vue. For more information, please follow other related articles on the PHP Chinese website!

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undress AI Tool

Undress AI Tool

Undress images for free

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

Hot Topics

PHP Tutorial
1580
276
A Deep Dive into WebAssembly (WASM) for Front-End Developers A Deep Dive into WebAssembly (WASM) for Front-End Developers Jul 27, 2025 am 12:32 AM

WebAssembly(WASM)isagame-changerforfront-enddevelopersseekinghigh-performancewebapplications.1.WASMisabinaryinstructionformatthatrunsatnear-nativespeed,enablinglanguageslikeRust,C ,andGotoexecuteinthebrowser.2.ItcomplementsJavaScriptratherthanreplac

Performance-First State Management with Zustand Performance-First State Management with Zustand Jul 25, 2025 am 04:32 AM

Zustandisalightweight,performantstatemanagementsolutionforReactappsthatavoidsRedux’sboilerplate;1.Useselectivestateslicingtopreventunnecessaryre-rendersbyselectingonlytheneededstateproperty;2.ApplycreateWithEqualityFnwithshalloworcustomequalitychecks

What is the purpose of the rel attribute in a link tag in HTML? What is the purpose of the rel attribute in a link tag in HTML? Aug 03, 2025 pm 04:50 PM

rel="stylesheet"linksCSSfilesforstylingthepage;2.rel="preload"hintstopreloadcriticalresourcesforperformance;3.rel="icon"setsthewebsite’sfavicon;4.rel="alternate"providesalternateversionslikeRSSorprint;5.rel=&qu

Understanding and Implementing OAuth 2.0 on the Front-End Understanding and Implementing OAuth 2.0 on the Front-End Jul 25, 2025 am 04:31 AM

When using OAuth 2.0, PKCE authorization code process should be adopted instead of implicit process, avoid storing tokens in localStorage on the front end, priority is given to processing refresh tokens through the back end, and secure integration is achieved using a trusted authentication library to ensure the security of front-end applications.

What is the purpose of the anchor tag's target attribute in HTML? What is the purpose of the anchor tag's target attribute in HTML? Aug 02, 2025 pm 02:23 PM

ThetargetattributeinanHTMLanchortagspecifieswheretoopenthelinkeddocument.1._selfopensthelinkinthesametab(default).2._blankopensthelinkinanewtaborwindow.3._parentopensthelinkintheparentframe.4._topopensthelinkinthefullwindowbody,removingframes.Forexte

Optimizing Performance with Next.js 14 and the App Router Optimizing Performance with Next.js 14 and the App Router Jul 26, 2025 am 07:54 AM

UseservercomponentsbydefaulttoreduceclientJavaScriptandimproveloadtime;2.LeveragelayoutcachingforpersistentUIwithoutre-rendersduringnavigation;3.Optimizedatafetchingwithautomaticcachingandrevalidationusingfetchoptions;4.StreamcontentwithSuspenseandlo

Creating Complex UI Layouts with CSS Subgrid Creating Complex UI Layouts with CSS Subgrid Jul 26, 2025 am 06:19 AM

CSSSubgridenableschildelementstoalignacrossrowsandcolumnsofaparentgrid,solvingalignmentissuesinnestedlayouts.1.Itallowsagriditemtoinherittheparent’sgridstructurebyusingsubgridforgrid-template-rowsorgrid-template-columns.2.Thisisusefulinforms,cardcomp

Frontend Internationalization (i18n) Best Practices Frontend Internationalization (i18n) Best Practices Jul 26, 2025 am 07:59 AM

Four steps are required to achieve the internationalization of the front-end: First, use structured JSON to centrally manage the translation content to avoid hard coding; second, use mature i18n libraries such as react-i18next, vue-i18n or formatjs to support complex language rules; third, design in advance to adapt to different language lengths and RTL layouts, reserve space and use elastic layouts; fourth, add translation annotations to clarify the context, facilitate collaboration. These four points can reduce maintenance costs and improve multilingual adaptation accuracy and development efficiency.

See all articles