Vue3 列表数据流:从赋值入门到进阶(独立学习版)

这是一份脱离具体业务项目也能看的学习资料。

目标:学会把一个"可查询、可分页、可渲染"的列表,按清晰的数据流搭起来。


1. 入门:先搞懂 ref 是怎么赋值的

ts 复制代码
import { ref } from 'vue'

type User = {
  id: number
  name: string
}

const users = ref<User[]>([])

users.value = [
  { id: 1, name: 'Alice' },
  { id: 2, name: 'Bob' }
]

关键点:

  • ref 包裹后的值要通过 .value 读写
  • 给数组赋值时,直接替换新数组最直观

2. 入门:把数据渲染出来

vue 复制代码
<template>
  <view v-for="user in users" :key="user.id">
    {{ user.name }}
  </view>
</template>

这一步只有一个目标:先通路,别一上来就加筛选、分页、排序。


3. 进阶第一步:建立"三层数据"

很多人后期越改越乱,是因为把所有逻辑都操作同一个数组。

建议从一开始就拆三层:

ts 复制代码
const sourceData = ref<User[]>([])         // 源数据层(永远保留)
const filteredData = ref<User[]>([])       // 结果层(筛选后)
const visibleData = computed(() =>         // 展示层(分页后)
  filteredData.value.slice(0, visibleCount.value)
)

这就是最核心的数据流:

sourceData -> filteredData -> visibleData -> UI


4. 查询筛选:永远基于源数据

ts 复制代码
const keyword = ref('')

function doSearch() {
  const kw = keyword.value.trim().toLowerCase()
  filteredData.value = sourceData.value.filter(item =>
    !kw || item.name.toLowerCase().includes(kw)
  )
  visibleCount.value = pageSize
}

为什么这么做:

  • 不会出现"筛选一次后源数据丢失"
  • 清空条件可直接回到全量
  • 逻辑稳定,容易测

5. 分页:只改窗口,不改结果集

ts 复制代码
const pageSize = 10
const visibleCount = ref(pageSize)

function loadMore() {
  visibleCount.value = Math.min(
    visibleCount.value + pageSize,
    filteredData.value.length
  )
}

思想:分页是"显示多少条",不是"删掉后面的数据"。


6. 初始化流程(标准模板)

ts 复制代码
async function init() {
  // 1) 拉取源数据
  sourceData.value = await fetchList()

  // 2) 初始化筛选结果(通常等于全量)
  filteredData.value = [...sourceData.value]

  // 3) 初始化分页窗口
  visibleCount.value = pageSize
}

这三步顺序尽量固定,团队协作时非常省心。


7. 常见坑(高频)

坑 1:直接改 sourceData

错误示例:

ts 复制代码
sourceData.value = sourceData.value.filter(...)

后果:你把"原件"改没了,清空筛选很难恢复。

坑 2:查询后忘了重置分页

如果不重置 visibleCount,会出现:

  • 新结果很少,但页面还按旧窗口显示逻辑跑
  • 滚动状态、空态表现异常

坑 3:key 不稳定

v-for 尽量用业务唯一 id,不要用下标。


8. 命名建议(可直接套用)

  • sourceData:全量源数据
  • filteredData:当前条件结果
  • visibleData:当前页可见数据
  • visibleCount:当前可见条数
  • pageSize:每页大小

比起 list1/list2/list3,这种命名更容易维护。


9. 一个最小可运行思路

ts 复制代码
const sourceData = ref<Item[]>([])
const filteredData = ref<Item[]>([])
const pageSize = 10
const visibleCount = ref(pageSize)

const visibleData = computed(() =>
  filteredData.value.slice(0, visibleCount.value)
)

function resetFilter() {
  filteredData.value = [...sourceData.value]
  visibleCount.value = pageSize
}

只要你先把这个骨架搭好,后续加排序、多条件筛选、远程分页都不会乱。


10. 从入门到进阶的学习路线

  1. 入门 :掌握 ref / .value / v-for
  2. 基础工程化:把列表拆成三层数据
  3. 交互完善:加搜索 + 重置 + 触底加载
  4. 进阶:加入排序、组合筛选、缓存查询条件
  5. 高级 :接入后端分页和防抖搜索 : 进阶文档

11. 一句话总结

列表页稳定的核心不是"某个 API",而是数据分层思想:

源数据不动,结果数据承接条件,展示数据只负责窗口。

相关推荐
IT乐手32 分钟前
Claude Code + Qwen 的配置方法
javascript·claude
子兮曰2 小时前
DeepSeek TUI:原生 Rust 打造的终端 AI 编码 Agent
前端·javascript·后端
暗不需求2 小时前
# 深入 React Todos:从零实现一个状态提升与本地持久化的待办应用
javascript·react.js·全栈
子兮曰2 小时前
深入 Superpowers:180k Stars 的开源 AI 编程方法论是如何工作的
前端·javascript·后端
不会敲代码13 小时前
从零到一:用 Vue3 + Kimi 大模型打造「拍照记单词」AI 应用
vue.js·typescript·aigc
隔壁的大叔3 小时前
Markdown 渲染如何穿插自定义组件
前端·javascript·vue.js
我命由我123453 小时前
程序员的心理学学习笔记 - 空杯心态
经验分享·笔记·学习·职场和发展·求职招聘·职场发展·学习方法
薯老板3 小时前
JavaScript原型,原型链
javascript
RONIN3 小时前
脚手架搭建项目框架(create-vite、vue-cli、create-vue、quasar-cli)
vue.js
stm32 菜鸟3 小时前
nucleo-f411re学习记录-13,flash的操作
学习