当前位置:   article > 正文

vue搜索框过滤--- computed、watch区别

vue搜索框过滤--- computed、watch区别

vue组件选项(component options)

1. computed(计算属性)

  • 用途computed属性用于声明性地描述一些依赖其它响应式属性的数据。当依赖的响应式属性变化时,计算属性会自动重新求值。
  • 缓存:计算属性是基于它们的依赖进行缓存的。只有在相关依赖发生改变时才会重新求值。
  • 声明方式:在组件的computed选项中声明,返回一个计算值。
  • 场景:适合用在模板渲染中,或者任何需要根据组件状态变化而变化的数据上。

2. watch(侦听器)

  • 用途watch用于观察和响应Vue实例上数据的变动。当指定的数据发生变化时,可以执行异步操作或开销较大的操作。
  • 无缓存:与计算属性不同,watch不会缓存结果。每次指定的数据发生变化时,都会执行相应的回调。
  • 声明方式:在组件的watch选项中声明,为每个需要观察的数据提供一个回调函数。
  • 场景:适合在数据变化时执行异步或开销较大的操作,如数据验证、发送请求等。

3. methods(方法)

  • 用途methods定义了组件的具体行为,即可以在组件的模板中调用,或在组件的其它逻辑中调用的函数。
  • 无缓存:与watch类似,methods中的函数在每次调用时都会执行,而不会缓存结果。
  • 声明方式:在组件的methods选项中声明,可以包含任何逻辑。
  • 场景:适合定义任何类型的函数,包括事件处理函数、业务逻辑函数等。

总结

  • 计算属性computed)适用于需要基于其他数据动态变化,并且需要缓存的场景。
  • 侦听器watch)适用于需要响应数据变化,执行异步或开销较大操作的场景。
  • 方法methods)适用于定义组件的具体行为,包括事件处理和业务逻辑等。
  1. <template>
  2. <div class="address-book-single">
  3. <van-search
  4. v-model="keywords"
  5. :placeholder="搜索"
  6. />
  7. <!-- 人员 -->
  8. <div v-for="(item, index) in filteredList" :key="item.id">
  9. {{ item.name }}
  10. </div>
  11. </div>
  12. </template>
  13. <script>
  14. import { Search} from 'vant'
  15. export default {
  16. name: 'AddressBook',
  17. components: {
  18. [Search.name]: Search
  19. },
  20. props: {
  21. templateId: {
  22. type: String,
  23. default: ''
  24. },
  25. version: {
  26. type: Number,
  27. default: 0
  28. },
  29. nodeNo: {
  30. type: String,
  31. default: ''
  32. }
  33. },
  34. data() {
  35. return {
  36. userList: [],
  37. keywords: '', // 搜索名称
  38. //不需要filterdeList: [],
  39. /*在computed选项中定义计算属性时,不需要显式地在组件的data函数中声明,
  40. 因为它不是组件的原始状态数据,而是基于组件状态数据计算得出的结果。*/
  41. }
  42. },
  43. computed: {
  44. filteredList(){
  45. return this.keywords ? this.userList.filter(item=>
  46. item.name.toLowerCase().includes(this.keywords.toLowerCase())) : this.userList
  47. }
  48. },
  49. mounted() {
  50. this.getUsersList()
  51. },
  52. methods: {
  53. async getUsersList() {
  54. this.loadUser = true
  55. this.showLoading()
  56. let { data } = await mine.approvalsApi.getNodeUsers({
  57. templateId: this.templateId,
  58. version: this.version,
  59. nodeNo: this.nodeNo
  60. })
  61. const result = data.data
  62. ......
  63. this.userList = result
  64. .......
  65. },
  66. }
  67. }
  68. </script>
  69. <style lang="less" scoped>
  70. @import url("./index.less");
  71. </style>

  1. <template>
  2. <div class="address-book-single">
  3. <van-search
  4. v-model="keywords"
  5. :placeholder="搜索"
  6. @search="onSearch"
  7. @clear="onClear"
  8. />
  9. <!-- 人员 -->
  10. <div v-for="(item, index) in filteredList" :key="item.id">
  11. {{ item.name }}
  12. </div>
  13. </div>
  14. </template>
  15. <script>
  16. import { Search} from 'vant'
  17. export default {
  18. ......
  19. data() {
  20. return {
  21. userList: [],
  22. keywords: '', // 搜索名称
  23. filterdeList: [],
  24. }
  25. },
  26. mounted() {
  27. this.getUsersList()
  28. },
  29. methods: {
  30. async getUsersList() {
  31. ......
  32. this.userList = result
  33. this.filteredList = this.userList
  34. .......
  35. },
  36. //搜索框过滤
  37. onSearch() {
  38. this.filteredList = this.userList.filter(item=>
  39. item.name.toLowerCase().includes(this.keywords.toLowerCase()))
  40. },
  41. onClear(){
  42. this.getUsersList()
  43. }
  44. }
  45. }
  46. </script>
  1. async getUsersList() {
  2. this.loadUser = true
  3. this.showLoading()
  4. // let { data } = await mine.approvalsApi.getNodeUsers({
  5. // templateId: this.templateId,
  6. // version: this.version,
  7. // nodeNo: this.nodeNo
  8. // })
  9. // const result = data.data
  10. /*模拟多条数据测试filter方法是否正确*/
  11. const result = [
  12. {
  13. "id":"1826653056754913280",
  14. "name":"小明"
  15. },
  16. {
  17. "id":"1826",
  18. "name":"pk"
  19. },
  20. {
  21. "id":"182665",
  22. "name":"PK"
  23. },
  24. {
  25. "id":"18",
  26. "name":"小明12"
  27. },
  28. {
  29. "id":"18",
  30. "name":"123"
  31. },
  32. ]
  33. if (result && result.length) {
  34. this.loadUser = false
  35. this.hideLoading()
  36. result.forEach((item) => {
  37. item.isChecked = this.checkedUser.some((uitem) => item.id === uitem.id)
  38. })
  39. if (result.length === this.checkedUser.length) {
  40. // 是否为全选
  41. this.checkedUserCount = result.length
  42. }
  43. this.userList = result
  44. } else if (result.length === 0) {
  45. this.$toast.clear()
  46. }
  47. },

 

<van-search> 组件

是 Vant(一个轻量、可靠的移动端 Vue 组件库)中的一个搜索组件,在searchinput 和 clear 三个事件

1. input 事件

  • 用途:每次输入时都会触发,无论输入的是文字还是进行了删除操作。
  • 触发时机:每当搜索框中的值发生变化时,就会触发这个事件。
  • 应用场景:实时地根据用户的输入来过滤或查询数据,实现搜索建议、即时搜索等功能。

2. search 事件

  • 用途:在用户完成输入并主动触发搜索时才会触发,比如点击了搜索按钮或者按下了回车键。
  • 触发时机:具体触发时机可能依赖于 <van-search> 组件的配置和具体实现,但大多数情况下,它是在用户明确表示要执行搜索操作时触发的。
  • 应用场景:执行真正的搜索操作,比如向服务器发送搜索请求,获取搜索结果等。

3. clear 事件

  • 用途:点击了清除按钮(通常是搜索框旁边的小叉号),意图清空搜索框中的内容时触发的。
  • 触发时机:当用户点击清除按钮,意图清空搜索框中的文本时。
  • 应用场景:清空搜索框绑定的数据模型,或者执行一些与清空操作相关的逻辑,比如重置搜索结果等。

总结

  • input 事件用于处理用户输入过程中的每一次变化,适合实现即时搜索或搜索建议。
  • search 事件用于处理用户完成输入并明确发起搜索请求的情况,适合执行真正的搜索操作。
  • clear 事件用于处理用户清空搜索框的操作,适合执行与清空操作相关的逻辑。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小桥流水78/article/detail/850817
推荐阅读
相关标签
  

闽ICP备14008679号