Vue 输入事件未捕获整个字段

Vue input event not capturing entire field

我有一个添加搜索栏和搜索栏功能的 vue 组件。它包含这一行:

<input class="input" type="text" placeholder="Address" v-model="searchQuery" v-on:input="(event) => this.$emit('queryChange', event)">

这会捕获搜索栏中的文本并发出它。

在我的 vue 中,这会触发我的 updateSearchQuery 函数: this.searchQuery = event.data 仅将用户输入保存在我的 vue 中的 searchQuery 属性 中。当我这样做时一切正常,直到我进行搜索然后使用相同的 this.searchQuery 数据进行另一个调用。

例如,我正在尝试使用搜索查询“956”过滤结果。我输入它并进行此调用:GET /users?cp=1&pp=20&se=956,就像它应该的那样。然后在页面加载后,如果我转到结果的第 2 页,这是对服务器的调用:GET /users?cp=2&pp=20&se=6。不是将 956 保存为视图中的 queryStr,它只保存最近输入的字符,而不是搜索文本的全部内容

每次我输入多个字符作为搜索查询,然后使用未更改的 this.searchQuery 变量再次调用服务器时,都会发生这种情况。如果我最初的搜索查询只是一个字符,它就可以正常工作。

我在这里做错了什么?在进行任何更改后,如何在搜索栏中发出全部文本,以便我始终可以保存整个搜索查询,而不仅仅是最近的更改?

编辑:我在下面添加了更多代码,以便更容易理解数据流:

这是搜索组件的模板和脚本:

<template>
  <div class="level-item">
    <div class="field has-addons">
      <div class="control">
        <input class="input" type="text" placeholder="Address" v-model.lazy="searchQuery" v-on:input="(event) => this.$emit('queryChange', event)">
      </div>
      <div class="control">
        <div class="button is-light" @click="clearInput">
                    <span class="icon is-small">
                        <i class="fa fa-times" style="color:#ffaaaa"></i>
                    </span>
        </div>
      </div>
      <div class="control">
        <button class="button is-info" @click="onSearch(searchQuery)">Search</button>
      </div>
    </div>
  </div>
</template>

<script>
  export default {
    name: 'Search',
    props: {onSearch: Function},
    data () {
      return {
        searchQuery: ''
      }
    },
    watch: {},
    methods: {
      clearInput () {
        this.searchQuery = ''
      }
    }
  }
</script>

在 vue 页面中捕获并监听发出的 queryChange 事件: <Search :onSearch="onSearch" v-on:queryChange="updateSearchQuery"> 这会触发 updateSearchQuery 函数:

updateSearchQuery (event) {
        this.searchQuery = event.data
        console.log(event.data + '  ||  event.data')
        console.log(this.searchQuery + '  ||  this.searchQuery')
      }

理论上,我的 vue 中的 searchQuery 数据应该是我的组件中的 searchQuery 数据的副本,它本身只是用户在搜索栏中输入的任何内容的副本。

然后当我调用服务器时,我在我的 vue 中使用 this.searchQuery 中的值:

onSearch (search) {
   this.makeServerQuery(1, search)
},
onPaginate (page) {
   this.makeServerQuery(page, this.searchQuery)
},
makeServerQuery (page = null, search = null) {
   let queryStr = ''
   if (page !== null) {
       queryStr += '?cp=' + page + '&pp=' + this.perPage
   }
   if (this.searchQuery !== '') {
       queryStr += '&se=' + this.searchQuery
   }   .....

只要按下搜索按钮,就会调用 on onSearch(search) 函数。这似乎工作正常,因为当按下按钮时,整个 searchQuery 都会被传递,而不仅仅是最后一个更改。

输入事件的 data 值似乎是最后键入的字符,而不是输入的当前值。一个简单的修复是:

@input="$emit('queryChange', searchQuery)"

这是可行的,因为模型将始终在输入事件处理程序运行之前更新。

这是一个完整的工作组件示例:

<input
  v-model="searchQuery"
  type="text"
  placeholder="Address"
  @input="onInput"
/>
export default {
  data() {
    return { searchQuery: '' };
  },
  methods: {
    onInput() {
      console.log(this.searchQuery);
      this.$emit('queryChange', this.searchQuery);
    },
  },
};