• Vue3.0 实现支持搜索和筛选的用户列表(带动画过渡效果)


    目录

    1. 常规风格的示例工程开发

    2. 使用组合式API重构用户列表页面

    3. 优化用户列表页面


    1. 常规风格的示例工程开发

    首先新建一个名为 normal.html 的测试文件,在HTML文件的head标签中引入Vue框架并设置常规的模板字段如下:

    1. <!DOCTYPE html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
    6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    7. <title>Document</title>
    8. <script src="https://unpkg.com/vue@next"></script>
    9. <style>
    10. .container {
    11. margin: 50px;
    12. }
    13. .content {
    14. margin: 20px;
    15. }
    16. </style>
    17. </head>
    18. <body>
    19. <div id="Application"></div>
    20. <script>
    21. const App = Vue.createApp({
    22. })
    23. App.mount('#Application')
    24. </script>
    25. </body>
    26. </html>

    为了方便逻辑的演示,我们先不添加样式,先从逻辑上梳理这样一个简单页面应用的开发思路。

    第一步,设计页面的根组件的数据框架,分析页面的功能需求,主要有三个:能够渲染用户列表、能够根据输入的关键字进行检索。因此,我们至少需要三个响应式的数据:用户列表数据、性别筛选字段和关键词字段。

    定义 组件的data选项如下:

    1. data() {
    2. return {
    3. //性别筛选字段
    4. sexFilter : -1,
    5. //展示的用户列表数据
    6. showDatas : [],
    7. //搜索的关键词
    8. sarchKey : ""
    9. }
    10. }

    上面定义的属性中,sexFilter 字段的取值可以是 -1、0或1 。 -1表示全部,0表示性别男,1表示性别女。

    第二步,思考页面需要支持的行为,首先从网络上请求用户数据,将其渲染到页面上(使用延时函数来模拟这一过程),要支持性别筛选功能,需要定义一个筛选函数来完成,同样要实现关键词检索功能,也需要定义一个检索函数。

    定义组件的methods选项如下:

    1. methods: {
    2. //获取用户数据
    3. queryAllData() {
    4. this.showDatas = mock
    5. },
    6. //进行性别筛选
    7. filterData() {
    8. if(this.sexFilter == -1) {
    9. this.showDatas = mock
    10. }else {
    11. this.showDatas = mock.filter((data) => {
    12. return data.sex == this.sexFilter
    13. })
    14. }
    15. },
    16. //进行关键词检索
    17. searchData() {
    18. if(this.searchKey.length == 0) {
    19. this.showDatas = mock
    20. }else {
    21. this.showDatas = mock.filter((data) => {
    22. //名称中包含输入的关键词则表示匹配成功
    23. return data.name.indexOf(this.searchKey) != -1
    24. })
    25. }
    26. }
    27. }

    对上面的代码进行汇总,mock变量是本地定义的模拟数据,方便我们测试效果,代码如下:

    1. let mock = [
    2. {
    3. name : "小王",
    4. sex : 0
    5. },
    6. {
    7. name : "小红",
    8. sex : 1
    9. },
    10. {
    11. name : "小李",
    12. sex : 1
    13. },
    14. {
    15. name : "小张",
    16. sex : 0
    17. }
    18. ]

    定义好了功能函数,我们需要在合适的时机对其进行调用,queryAllData 方法可以在组件挂载时调用来获取数据,当页面挂载后,延时3秒会获取到测试的模拟数据,代码如下:

    1. mounted() {
    2. //模拟请求过程
    3. setTimeout(() => {
    4. this.queryAllData
    5. }, 3000);
    6. },

    对于性别筛选和关键词检索功能,可以监听对应的属性,当这些属性发生变化时,进行筛选或检索行为。定义组件的watch选项如下:

    1. watch: {
    2. sexFilter(oldValue,newValue) {
    3. this.filterData()
    4. },
    5. searchKey(oldValue,newValue) {
    6. this.searchData()
    7. }
    8. }

    至此,我们编写完成当前页面应用的所有逻辑代码。还有第三步需要做,将页面渲染所需的HTML框架搭建完成,示例代码如下:

    1. <div id="Application">
    2. <div class="container">
    3. <div class="content">
    4. <input type="radio" :value="-1" v-model="sexFilter"/>全部
    5. <input type="radio" :value="0" v-model="sexFilter"/>
    6. <input type="radio" :value="1" v-model="sexFilter"/>
    7. </div>
    8. <div class="content">搜索:<input type="text" v-model="searchKey" /></div>
    9. <div class="content">
    10. <table border="1" width="300px">
    11. <tr>
    12. <th>姓名</th>
    13. <th>性别</th>
    14. </tr>
    15. <tr v-for="(data, index) in showDatas">
    16. <td>{{data.name}}</td>
    17. <td>{{data.sex == 0 ? '男' : '女'}}</td>
    18. </tr>
    19. </table>
    20. </div>
    21. </div>
    22. </div>

    运行代码,可以看到一个支持筛选和检索的用户列表应用以及完成了,效果如下图所示:

    2. 使用组合式API重构用户列表页面

    在上一节中我们实现了完整的用户列表页面。深入分析我们编写的代码,可以发现需要关注的逻辑点十分分散,例如用户的性别筛选是一个独立的功能,要实现这样一个功能,需要先在data选项中定义属性,之后在methods选项中定义功能方法,最后在watch选项中监听属性,实现筛选功能。这些逻辑点的分离使得代码的可读性变差,并且随着项目的迭代,页面的功能可能会越来越复杂,对于后续此组建的维护者来说,扩展会变得更加困难。

    Vue3提供的组合式API的开发风格可以很好的解决这个问题,我们可以将逻辑都梳理在setup方法中,相同的逻辑点聚合性更强,更易阅读和扩展。

    使用组合式API重写后的完整代码如下:

    1. let mock = [
    2. {
    3. name:"小王",
    4. sex:0
    5. },{
    6. name:"小红",
    7. sex:1
    8. },{
    9. name:"小李",
    10. sex:1
    11. },{
    12. name:"小张",
    13. sex:0
    14. }
    15. ]
    16. const App = Vue.createApp({
    17. setup() {
    18. // 用户列表
    19. const showDatas = Vue.ref([])
    20. const queryAllData = () => {
    21. // 模拟请求过程
    22. setTimeout(()=>{
    23. showDatas.value = mock
    24. }, 3000);
    25. }
    26. // 组件挂载是请求数据
    27. Vue.onMounted(queryAllData)
    28. let sexFilter = Vue.ref(-1)
    29. let searchKey = Vue.ref("")
    30. let filterData = () => {
    31. if (sexFilter.value == -1) {
    32. showDatas.value = mock
    33. } else {
    34. showDatas.value = mock.filter((data)=>{
    35. return data.sex == sexFilter.value
    36. })
    37. }
    38. }
    39. searchData = () => {
    40. if (searchKey.value.length == 0) {
    41. showDatas.value = mock
    42. } else {
    43. showDatas.value = mock.filter((data)=>{
    44. return data.name.search(searchKey.value) != -1
    45. })
    46. }
    47. }
    48. // 添加侦听
    49. Vue.watch(sexFilter, filterData)
    50. Vue.watch(searchKey, searchData)
    51. return {
    52. showDatas,
    53. searchKey,
    54. sexFilter
    55. }
    56. },
    57. template: `
    58. <div class="container">
    59. <div class="content">
    60. <input type="radio" :value="-1" v-model="sexFilter"/>全部
    61. <input type="radio" :value="0" v-model="sexFilter"/>男
    62. <input type="radio" :value="1" v-model="sexFilter"/>女
    63. </div>
    64. <div class="content">搜索:<input type="text" v-model="searchKey" /></div>
    65. <div class="content">
    66. <table border="1" width="300px">
    67. <tr>
    68. <th>姓名</th>
    69. <th>性别</th>
    70. </tr>
    71. <tr v-for="(data, index) in showDatas">
    72. <td>{{data.name}}</td>
    73. <td>{{data.sex == 0 ? '男' : '女'}}</td>
    74. </tr>
    75. </table>
    76. </div>
    77. </div>
    78. `
    79. })
    80. App.mount("#Application")

    在使用组合式API编写代码时,特别要注意,对于需要使用的响应式数据,要使用 ref 方法或 reactive方法进行包装。

    3. 优化用户列表页面

    在上一节中我们通过组合式API重写了用户列表页面,但是现在页面筛选和搜索功能都比较生硬,在本节,我们尝试给他添加一些动画效果。 

    首先要实现列表动画效果,需要对定义的组件模板结果做一下改动,示例代码如下:

    1. template: `
    2. <div class="container">
    3. <div class="content">
    4. <input type="radio" :value="-1" v-model="sexFliter"/>全部
    5. <input type="radio" :value="0" v-model="sexFliter"/>
    6. <input type="radio" :value="1" v-model="sexFliter"/>
    7. </div>
    8. <div class="content">搜索:<input type="text" v-model="searchKey" /></div>
    9. <div class="content">
    10. <div class="tab" width="300px">
    11. <div>
    12. <div class="item">姓名</div>
    13. <div class="item">性别</div>
    14. </div>
    15. <transition-group name="list">
    16. <div v-for="(data, index) in showDatas" :key="data.name">
    17. <div class="item">{{data.name}}</div>
    18. <div class="item">{{data.sex == 0 ? '男' : '女'}}</div>
    19. </div>
    20. </transition-group>
    21. </div>
    22. </div>
    23. </div>
    24. `

    对应的,定义CSS样式与动画样式如下:

    1. .container {
    2. margin: 50px;
    3. }
    4. .content {
    5. margin: 20px;
    6. }
    7. .tab {
    8. width: 300px;
    9. position: absolute;
    10. }
    11. .item {
    12. border: gray 1px solid;
    13. width: 148px;
    14. text-align: center;
    15. transition: all 0.8s ease;
    16. display: inline-block;
    17. }
    18. .list-enter-active {
    19. transition: all 1s ease;
    20. }
    21. .list-enter-from,
    22. .list-leave-to {
    23. opacity: 0;
    24. }
    25. .list-move {
    26. transition: transform 1s ease;
    27. }
    28. .list-leave-active {
    29. position: absolute;
    30. transition: all 1s ease;
    31. }

    现在运行代码,可以看到当对用户列表进行筛选、搜索时,列表的变化以及有了动画过渡效果:

     

  • 相关阅读:
    Linux下的网络设备驱动
    《Java基础知识》Java 浅拷贝与深拷贝2
    第一章:各种款式的算法复杂度例子+计算小技巧
    重塑 Google 搜索、Android 13 新版发布,这届 I/O 大会为开发者带来了什么?
    gdb调试常见命令详细总结
    matlab小波分析时频谱图 声音时频信号处理
    java练习 day5
    Smartbi入选Gartner ABI领域“客户之声”,荣获“卓越表现者”
    go-协程调度学习笔记
    支持向量机SVM
  • 原文地址:https://blog.csdn.net/qq_49900295/article/details/124836589