当前位置:首页 > VUE

vue js 实现新闻列表

2026-01-20 07:30:13VUE

实现新闻列表的步骤

创建Vue项目

使用Vue CLI或Vite创建一个新的Vue项目。确保已安装Node.js和npm/yarn。

npm init vue@latest news-list
cd news-list
npm install

准备新闻数据

src目录下创建一个data文件夹,添加news.js文件存储新闻数据。

// src/data/news.js
export default [
  {
    id: 1,
    title: 'Vue 3.0 正式发布',
    content: 'Vue 3.0带来了Composition API等新特性...',
    date: '2023-01-15',
    author: 'Evan You'
  },
  {
    id: 2,
    title: 'Vue Router 4.0 新特性',
    content: 'Vue Router 4.0支持Vue 3并提供更好的TypeScript集成...',
    date: '2023-02-20',
    author: 'Eduardo San Martin'
  }
]

创建新闻列表组件

components目录下创建NewsList.vue组件。

<!-- src/components/NewsList.vue -->
<template>
  <div class="news-list">
    <h2>新闻列表</h2>
    <ul>
      <li v-for="newsItem in news" :key="newsItem.id">
        <h3>{{ newsItem.title }}</h3>
        <p>{{ newsItem.content }}</p>
        <span>{{ newsItem.date }} - {{ newsItem.author }}</span>
      </li>
    </ul>
  </div>
</template>

<script>
import newsData from '@/data/news'

export default {
  data() {
    return {
      news: newsData
    }
  }
}
</script>

<style scoped>
.news-list {
  max-width: 800px;
  margin: 0 auto;
}
ul {
  list-style: none;
  padding: 0;
}
li {
  margin-bottom: 20px;
  padding: 15px;
  border: 1px solid #ddd;
  border-radius: 5px;
}
</style>

在App.vue中使用组件

修改App.vue文件,引入并使用新闻列表组件。

<!-- src/App.vue -->
<template>
  <div id="app">
    <NewsList />
  </div>
</template>

<script>
import NewsList from './components/NewsList.vue'

export default {
  components: {
    NewsList
  }
}
</script>

<style>
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  color: #2c3e50;
  padding: 20px;
}
</style>

添加路由功能(可选)

如需实现新闻详情页,可以添加Vue Router。

安装Vue Router:

npm install vue-router@4

创建路由配置:

// src/router/index.js
import { createRouter, createWebHistory } from 'vue-router'
import NewsList from '@/components/NewsList.vue'
import NewsDetail from '@/components/NewsDetail.vue'

const routes = [
  {
    path: '/',
    name: 'NewsList',
    component: NewsList
  },
  {
    path: '/news/:id',
    name: 'NewsDetail',
    component: NewsDetail,
    props: true
  }
]

const router = createRouter({
  history: createWebHistory(),
  routes
})

export default router

创建新闻详情组件:

<!-- src/components/NewsDetail.vue -->
<template>
  <div class="news-detail">
    <h2>{{ newsItem.title }}</h2>
    <p>{{ newsItem.content }}</p>
    <p><small>{{ newsItem.date }} - {{ newsItem.author }}</small></p>
    <router-link to="/">返回列表</router-link>
  </div>
</template>

<script>
import newsData from '@/data/news'

export default {
  props: ['id'],
  computed: {
    newsItem() {
      return newsData.find(item => item.id === parseInt(this.id))
    }
  }
}
</script>

修改NewsList组件添加链接:

<template>
  <!-- ...其他代码... -->
  <li v-for="newsItem in news" :key="newsItem.id">
    <router-link :to="'/news/' + newsItem.id">
      <h3>{{ newsItem.title }}</h3>
    </router-link>
    <!-- ...其他代码... -->
  </li>
  <!-- ...其他代码... -->
</template>

运行项目

启动开发服务器查看效果:

npm run dev

高级功能扩展

添加API数据获取

使用axios获取远程API数据:

安装axios:

npm install axios

修改NewsList组件:

import axios from 'axios'

export default {
  data() {
    return {
      news: [],
      loading: true,
      error: null
    }
  },
  async created() {
    try {
      const response = await axios.get('https://api.example.com/news')
      this.news = response.data
    } catch (err) {
      this.error = err.message
    } finally {
      this.loading = false
    }
  }
}

添加分页功能

在组件中添加分页逻辑:

data() {
  return {
    currentPage: 1,
    itemsPerPage: 5,
    // ...其他数据
  }
},
computed: {
  paginatedNews() {
    const start = (this.currentPage - 1) * this.itemsPerPage
    return this.news.slice(start, start + this.itemsPerPage)
  },
  totalPages() {
    return Math.ceil(this.news.length / this.itemsPerPage)
  }
}

模板中添加分页控件:

<div class="pagination">
  <button 
    @click="currentPage--" 
    :disabled="currentPage === 1"
  >上一页</button>
  <span>第 {{ currentPage }} 页 / 共 {{ totalPages }} 页</span>
  <button 
    @click="currentPage++" 
    :disabled="currentPage === totalPages"
  >下一页</button>
</div>

添加搜索功能

实现新闻标题搜索:

data() {
  return {
    searchQuery: '',
    // ...其他数据
  }
},
computed: {
  filteredNews() {
    if (!this.searchQuery) return this.paginatedNews
    return this.news.filter(item => 
      item.title.toLowerCase().includes(this.searchQuery.toLowerCase())
    )
  }
}

模板中添加搜索框:

<input 
  v-model="searchQuery" 
  placeholder="搜索新闻标题..."
  class="search-input"
>

vue js 实现新闻列表

标签: 列表新闻
分享给朋友:

相关文章

vue实现列表循环

vue实现列表循环

Vue 列表循环的实现方法 在 Vue 中,可以通过 v-for 指令实现列表循环渲染。以下是几种常见的实现方式: 基础列表渲染 <template> <ul>…

vue实现列表权限

vue实现列表权限

实现列表权限的基本思路 在Vue中实现列表权限通常涉及根据用户角色或权限动态渲染列表内容。核心逻辑是通过权限判断控制列表项的显示、隐藏或操作权限。 权限数据管理 使用Vuex或Pinia存储全局权限…

网页制作css 列表

网页制作css 列表

创建CSS列表样式 使用CSS可以自定义HTML列表(有序列表<ol>和无序列表<ul>)的外观,包括项目符号、缩进、颜色等。以下是一些常见的列表样式方法: 基础列表样式…

vue实现列表水印

vue实现列表水印

实现列表水印的方法 在Vue中为列表添加水印可以通过多种方式实现,以下是几种常见的方法: 使用CSS背景图 通过CSS的background-image属性为列表元素添加水印背景。水印可以是文字或…

vue实现列表显示

vue实现列表显示

使用 Vue 实现列表显示 基础列表渲染 在 Vue 中,可以通过 v-for 指令实现列表渲染。以下是一个简单的示例: <template> <ul> <…

js实现列表

js实现列表

使用 JavaScript 实现列表 JavaScript 提供了多种方式来实现列表功能,包括数组操作、DOM 元素动态生成等。以下是几种常见的实现方法: 使用数组存储列表数据 数组是 JavaSc…