Vuex form表单处理, 比官网更好的办法
Vuex form表单处理, 比官网更好的办法
问题, 当使用vuex的state作为表单的v-model元素, 虽然简单粗暴, 但这种修改没有经过mutation方法. 在严格模式下会抛出错误
1. 错误提示
错误代码如下
[Vue warn]: Error in callback for watcher "function () { return this._data.$$state }": "Error: [vuex] do not mutate vuex store state outside mutation handlers."
2. 相关场景
vuex中相关代码
const state = ()=>({
user: {
username: '123',
password: '123',
}
});
const getters = {
userName: state=>state.userName,
user: state=>state.user,
};
const mutations = {
changeObject(state, payload){
// es6语法
state.user = {...state.user, ...payload};
},
};
其中定义了user变量
组件中相关代码
// 获取vuex中user
...mapGetters('module1', [
'user',
]),
// 改变vuex中user状态
...mapMutations('module1', [
'changeObject',
]),
3. 官网建议方法
- 给
<input>
中绑定 value,然后侦听input
或者change
事件,在事件回调中调用一个方法 - 另一个方法是使用带有 setter 的双向绑定计算属性
// ...
computed: {
message: {
get () {
return this.$store.state.obj.message
},
set (value) {
this.$store.commit('updateMessage', value)
}
}
}
这两种方法都有一种很大的缺陷, 必须定义每个输入元素的变量, 比如, 现在有个表单, 里面有20个元素, 那么此时就要写20个方法来响应输入框的变化, 作为工匠人, 不得不采取更好的办法
4. 解决方案
个人在网上找了一些解决方案, 有用proxy代理, 有封装一些方法的, 这些在我看来, 都挺勉强的
经过一系列尝试, 我改良了官网描述的第二种方法, 将表单元素与vuex双向绑定, 并且经过了mutation, 严格模式下不报错
核心代码如下
定义表单对象
// 定义在computed下
object: {
set(val){
// console.log(val);
this.changeObject(val);
},
//这里需要注意, 获取的是user信息, 并非对象, 采用扩展运算符处理
get(){
return {...this.user}
}
}
获取表单变化代码
<form :model="object" @input="inputChange">
<input type="text" v-model="object.username">
<input type="text" v-model="object.password">
</form>
// ... methods中方法
inputChange(){
this.object = {...this.object}
},
5. 整体解释
- vuex定义username和password
- object 通过 get 获取到username和password进行初始化
- 表单输入触发inputChange方法改变 object 对象, 触发object对象的 set 方法
- object的 set 方法改变了 vuex中的值
- vuex 值发生改变, 从而触发 object 的 get 方法
- object值发生改变, 从而形成一个循环链
A(vuex定义变量) --> B(初始化表单object)
B --> C(表单输入触发inputChange方法)
C --> D(inputChange触发object的set方法)
D --> E(object的set方法改变vuex中的状态变量)
E --> F(vuex状态变化触发object的get方法)
- 初始状态
- 改变username后的状态
- 改变password后的状态
Vuex form表单处理, 比官网更好的办法的更多相关文章
- jQuery Form 表单提交插件----Form 简介,官方文档,官方下载地址
一.jQuery Form简介 jQuery Form插件是一个优秀的Ajax表单插件,可以非常容易地.无侵入地升级HTML表单以支持Ajax.jQuery Form有两个核心方法 -- ajaxF ...
- react引用antd的form表单
引用form是第三方插件ant插件,官网网址:https://ant.design/.用到的antd的版本是@2.0.1.form(https://ant.design/components/form ...
- input file 在开发中遇到的问题 类似ajax form表单提交 input file中的文件
最近在做项目的过程中遇到个问题,在这里做个记录防止日后忘记 现今的主流浏览器由于ajax提交form表单无法把文件类型数据提交到后台,供后台处理,可是开发中由于某些原因又不得不用ajax提交文件, 为 ...
- vue elementUI之Form表单 验证
首先说一下 我在form表单里面遇见的坑: 1.例如我要给后台传的不是对象,而是一个数组,怎么写验证? 2.比如我有四个弹出框,都要做验证,这个时候就要注意了,每一个弹出框的ref都不能给的一样,并且 ...
- Ajax提交form表单内容和文件(jQuery.form.js)
jQuery官网是这样介绍form.js A simple way to AJAX-ify any form on your page; with file upload and progress s ...
- Bootstrap学习总结笔记(24)-- 基于BootstrapValidator的Form表单验证
Form表单进行数据验证是十分必要的,我们可以自己写JS脚本或者使用JQuery Validate 插件来实现.对于Bootstrap而言,利用BootstrapValidator来做Form表单验证 ...
- 基于JQuery的前端form表单操作
Jquery的前端表单操作: jquery提供了良好的方法封装,在一些基本的操作的时候,能节省很多的麻烦,其中,在具体使用时,form表单的数据提交是最频繁也最常见的前后数据交换方式,所以在前 ...
- 结合Bootbox将后台JSON数据填充Form表单
本文介绍了如何结合Bootbox将后台JSON数据填充到Form表单中,同时也介绍了一些需要使用的知识的学习途径,并附上了参考文档地址与学习网址,对此感兴趣的伙伴可以直接访问学习.为了方便介绍,使用了 ...
- element-ui Form表单验证
element-ui Form表单验证规则全解 element的form表单非常好用,自带了验证规则,用起来很方便,官网给的案例对于一些普通场景完全没问题,不过一些复杂场景的验证还得自己多看文档摸索, ...
随机推荐
- PostgreSQL 报错 Problem running post-install step.Installation may not complete correctlyThe database cluster initialisation failed.
在点击完next后安装进度条到最后会弹出题目这个错误 之前选择locale选择china/Singapore 或者china/hongkong都会报错 我的解决方案是 不选择,使用默认的就不会报错,并 ...
- Java反射:new一个宝可梦吧
最近写Spring Boot的测试用例会发现经常会有用到@RunWith(SpringRunner.class)的设置注解,关于SpringRunner.class的理解也有点似是而非.其实这种写法是 ...
- 使用Guava RateLimiter限流入门到深入
前言 在开发高并发系统时有三把利器用来保护系统:缓存.降级和限流 缓存: 缓存的目的是提升系统访问速度和增大系统处理容量 降级: 降级是当服务出现问题或者影响到核心流程时,需要暂时屏蔽掉,待高峰或者问 ...
- python 数据分析之pandas
pandas 是数据分析时必须用到的一个库,功能非常强大 其有两种数据结构:一维Series 二维表DataFrame(一般读取后的数据都是df) 导入:import pandas as pd 数 ...
- 由Menu小项目所引发的对软件工程的思考
学习了孟老师的这几节课程,我学习了如何搭建一个简单的命令行menu小程序,从最简单的程序开始,一步步的根据软件工程的一般规律,进行逐步开发.完善,最终实现了一个比较通用的menu程序,可以让别的开发者 ...
- DataStructure-enum枚举
Enum:枚举类型 enum模块定义了一个提供迭代和比较功能的枚举类型.可以用这个模块为值创建明确定义的符号,而不是使用字面量整数或字符串. 创建枚举 可以使用class派生Enum,然后增加描述值得 ...
- The Product-Minded Software Engineer
转自The Product-Minded Software Engineer Product-minded engineers are developers with lots of interest ...
- css3 @keyframe 抖动/变色动画
一.纯css实现 .shake{ //抖动的元素 width: 200px; height: 100px; margin: 50px auto; background: ...
- 内网渗透 day1-基础
粘滞键和放大镜 1. 到/windows/system32下用takeown改变该文件夹下的文件拥有权(因为粘滞键和放大镜都在system32文件夹下) cd /Windows/system32 ...
- 2,flask URL进阶
video5 flask特点: 1,为框架,简介,高扩展性. 2,flask相关依赖(jinja2,werkzeug)设计优秀. 3,开发高效,如SQL的ORM video6 debug模式 我只推荐 ...