在 vue 中保存预填充的输入

Posted

技术标签:

【中文标题】在 vue 中保存预填充的输入【英文标题】:saving prefilled inputs in vue 【发布时间】:2018-03-19 10:27:03 【问题描述】:

我正在构建一个相当广泛的表单,并试图确保用户不会在简单的浏览器重新加载时丢失他们的数据。幸运的是,现在的浏览器在重新加载时会重新填充数据——事实上,v-model 的输入在beforeMount 期间有它。问题是,它们在mounted 上丢失了它,因为它们充满了来自相应模型的数据,这些数据相当合理,是空的。 现在,我想我可以用从 DOM 中提取的数据填充beforeMounted 上的模型——但是我能以某种方式从 DOM 中获取与对象挂钩的v-model 的引用吗?或者你有其他方法可以做到吗?

【问题讨论】:

【参考方案1】:

假设您正在创建一个用户,因此您在组件中将用户模型定义为

data () 
  return 
    user: 
      email: '',
      password: ''
    
  

还有像<input type="email" v-model.lazy="user.email" /> 这样的输入元素(注意lazy 修饰符,例如,出于性能目的,我建议您使用它)。

现在,您可以为user 模型设置一个watcher,将其值存储在sessionStorage 中(我的选择,您可以改用localStorage)。 阅读文档:https://vuejs.org/v2/guide/computed.html#Watchers

在您的组件中:

watch: 
  user (newValues, oldValues) 
    window.sessionStorage.setItem('userData', JSON.stringify(newValues))
  

现在,请确保在安装组件之前加载值

created ()  // created hook
  let userData = window.sessionStorage.getItem('userData')

  if (userData) 
    try 
      userData = JSON.parse(userData)

      // now initiate the model
      this.user.email = userData.email
      this.user.password = userData.password
     catch (err) 
      // userData was not a valid json string
    
  

【讨论】:

这给了我一个在 vue 之外保存数据的想法。谢谢!【参考方案2】:

好的,我真的很想为此利用浏览器的内置功能——尤其是通过这个简单的技巧,我可以在全局混合/插件中使用它,并且它与数据结构无关。我将所有需要的信息保存在 DOM 中,并在调用 mounted 后重新更新 DOM。

export default 
    beforeMount() 
        document.querySelectorAll('input').forEach((el) => 
            if (el.value) 
                el.setAttribute('data-prefill', el.value)
            
        )
    ,
    mounted() 
        this.$el.querySelectorAll('[data-prefill]').forEach((el) => 
            this.$nextTick(function() 
                el.value = el.getAttribute('data-prefill')
                el.dispatchEvent(new Event('change'))
                el.dispatchEvent(new Event('input'))
            )
        )
    

【讨论】:

关于这个的一些事情: 1)如果页面被刷新(F5),元素属性上设置的输入值不是持久的。 2) 使用条件渲染时,某些输入元素可能尚未渲染。 3) 由于 (2),您现在依赖 dispatchEvent,应避免使用元素引用 (ref)。我强烈建议使用 watcher 方法,它也可以作为组件 mixin 来实现。

以上是关于在 vue 中保存预填充的输入的主要内容,如果未能解决你的问题,请参考以下文章

如何阻止 Chrome 预填充输入框?

从 Angular 2 上的查询参数中预填充输入文本框

使用 Javascript 预填充日期输入字段

点击“返回”按钮时禁用浏览器表单输入预填充/自动填充功能

预填充 jquery 令牌输入文本框

是否可以像 Whatsapp messenger 一样使用预填充文本输入字段的文本创建指向用户的链接?