【问题标题】:Vue same component inputs doesnt updateVue相同的组件输入不更新
【发布时间】:2019-08-30 04:53:43
【问题描述】:

我在导航菜单和人物页面重复使用了相同的组件

我的问题是,当导航中的 SearchComponent 输入更新其值时,人民页面 SearchComponent 输入不会更新其值,反之亦然。我应该如何在 Vue JS 中做到/实现这一点。以下是我的代码

搜索组件

<template>
  <div class="search">
     <input type="text" v-model="name">
     <input type="text" v-model="email">
     <input type="text" v-model="age">
  </div>
</template>
<script>
export default {
    name: 'SearchComponent',
  data() {
    return {
      name: '',
      email: '',
      age: ''
    }
  }
}
</script>

导航

<template>
  <div class="nav">
    <ul>
      <li>Home</li>
      <li>Contact</li>
      <li>About</li>
    </ul>
    <SearchComponent />
  </div>
</template>
<script>
import SearchComponent from './SearchComponent'
export default {
    name: 'NavComponent',
  data() {
    return {
      name: '',
      email: '',
      age: ''
    }
  },
  components: {SearchComponent}
}
</script>

人物页面

<template>
  <div class="persons">
    <SearchComponent />
    <PersonList />
  </div>
</template>
<script>
import SearchComponent from './SearchComponent'
import PersonList from './PersonList'
export default {
    name: 'PersonsPage',
  data() {
    return {
      name: '',
      email: '',
      age: ''
    }
  },
  components: {SearchComponent, PersonList}
}
</script>

【问题讨论】:

    标签: javascript vue.js vuejs2 frontend vue-component


    【解决方案1】:

    添加到@Eli,尝试这种方式为所有实例的数据共享相同的对象引用:

    <template>
      <div class="persons">
        <SearchComponent />
        <PersonList />
      </div>
    </template>
    <script>
    import SearchComponent from './SearchComponent'
    import PersonList from './PersonList'
    const personPageData = {
          name: '',
          email: '',
          age: ''
        };
    export default {
        name: 'PersonsPage',
      data() {
        return personPageData; //Same state object referred by all instances.
      },
      components: {SearchComponent, PersonList}
    }
    </script>
    

    【讨论】:

      【解决方案2】:

      那是因为每次你使用一个 Vue 组件,一个new instance of it is created

      由于组件是可重用的 Vue 实例,它们接受与新 Vue 相同的选项,例如 datacomputedwatchmethods 和生命周期挂钩。唯一的例外是一些特定于根的选项,例如 el

      因此,如果您希望所有 Instance 作为单个组件受到影响,则组件的 data 不应声明为函数,而应声明为对象,即

      data: {
        name: '',
        email: '',
        age: ''
      }
      

      代替

      data: function () {
        return {
         name: '',
        email: '',
        age: ''
        }
      }
      

      在您的情况下,您将其定义为:

      data() {
      return { 
         name: '',
         email: '',
         age: ''
       }
      }
      

      您还可以找到有关 Component ReusingOrganizing Components 的更多信息,并且由于 SearchComponentPersonList 组件是 Peoples 组件 的子组件还需要知道如何从Parent Component i.e Peoples to Child components传递数据

      【讨论】:

      • 我尝试将数据用作对象,但 Vue 在控制台中返回错误说数据必须是函数
      • @PenAndPapers 在外部(在脚本中)声明一个全局对象,并在函数的返回语句中返回相同的对象引用。
      【解决方案3】:

      那些SearchComponent即使是同一个组件,也是不同的实例。他们每个人都有自己独立的数据。如果您希望两者保持同步,我建议您使用 Vuex 来拥有一个可以用作事实来源的全球商店。

      【讨论】:

      • 那是我的想法,但不允许在这个项目中使用插件和类似的东西。 Vuex 可以让我们的生活更轻松。
      猜你喜欢
      • 2020-07-22
      • 2018-04-29
      • 2019-06-02
      • 1970-01-01
      • 2021-11-03
      • 2019-03-12
      • 2019-04-18
      • 1970-01-01
      • 2020-12-13
      相关资源
      最近更新 更多