diff --git a/components/form/__tests__/demo.test.js b/components/form/__tests__/demo.test.js index 4aa92023a..e5338b89c 100644 --- a/components/form/__tests__/demo.test.js +++ b/components/form/__tests__/demo.test.js @@ -1,3 +1,3 @@ import demoTest from '../../../tests/shared/demoTest'; -demoTest('form', { suffix: 'vue', skip: ['index.vue'] }); +demoTest('form', { suffix: 'vue', skip: ['index.vue', 'vuex.vue'] }); diff --git a/components/form/demo/index.vue b/components/form/demo/index.vue index d1ee8144f..2e22232b2 100644 --- a/components/form/demo/index.vue +++ b/components/form/demo/index.vue @@ -13,6 +13,8 @@ import FormInModal from './form-in-modal'; import FormInModalString from '!raw-loader!./form-in-modal'; import GlobalState from './global-state'; import GlobalStateString from '!raw-loader!./global-state'; +import VuexState from './vuex'; +import VuexStateString from '!raw-loader!./vuex'; import HorizontalLogin from './horizontal-login'; import HorizontalLoginString from '!raw-loader!./horizontal-login'; import Layout from './layout'; @@ -130,6 +132,9 @@ export default { <demo-container code={GlobalStateString}> <GlobalState /> </demo-container> + <demo-container code={VuexStateString}> + <VuexState /> + </demo-container> <demo-container code={NormalLoginString}> <NormalLogin /> </demo-container> diff --git a/components/form/demo/vuex.vue b/components/form/demo/vuex.vue new file mode 100644 index 000000000..053061433 --- /dev/null +++ b/components/form/demo/vuex.vue @@ -0,0 +1,98 @@ +<cn> +#### 表单数据存储于 Vuex Store 中 +通过使用 onFieldsChange 与 mapPropsToFields,可以把表单的数据存储到 Vuex 中。 +**注意:** +`mapPropsToFields` 里面返回的表单域数据必须使用 `Form.createFormField` 包装。 +</cn> + +<us> +#### Store Form Data into Vuex Store +We can store form data into Vuex Store. +**Note:** +You must wrap field data with `Form.createFormField` in `mapPropsToFields`. +</us> + + +<template> + <div id="components-form-demo-vuex"> + <a-form + :form="form" + @submit="handleSubmit" + > + <a-form-item label="Username"> + <a-input + v-decorator="[ + 'username', + { + rules: [{ required: true, message: 'Username is required!' }], + } + ]" + /> + </a-form-item> + <a-button + type="primary" + html-type="submit" + > + Submit + </a-button> + </a-form> + </div> +</template> + +<script> +export default { + computed: { + username () { + return this.$store.state.username; + }, + }, + watch: { + username (val) { + console.log('this.$store.state.username: ', val); + this.form.setFieldsValue({username: val}); + }, + }, + created () { + this.form = this.$form.createForm(this, { + onFieldsChange: (_, changedFields) => { + this.$emit('change', changedFields); + }, + mapPropsToFields: () => { + return { + username: this.$form.createFormField({ + value: this.username, + }), + }; + }, + onValuesChange: (_, values) =>{ + console.log(values); + // Synchronize to vuex store in real time + // this.$store.commit('update', values) + }, + }); + }, + methods: { + handleSubmit (e) { + e.preventDefault(); + this.form.validateFields((err, values) => { + if (!err) { + console.log('Received values of form: ', values); + this.$store.commit('update', values); + } + }); + }, + }, +}; +</script> +<style> +#components-form-demo-vuex .language-bash { + max-width: 400px; + border-radius: 6px; + margin-top: 24px; +} +</style> + + + + + diff --git a/package.json b/package.json index 645022dde..b0b803f96 100644 --- a/package.json +++ b/package.json @@ -165,6 +165,7 @@ "vue-server-renderer": "^2.5.16", "vue-template-compiler": "^2.5.16", "vue-virtual-scroller": "^0.12.0", + "vuex": "^3.1.0", "webpack": "^4.28.4", "webpack-cli": "^3.2.1", "webpack-dev-server": "^3.1.14", diff --git a/site/index.js b/site/index.js index 53a716683..1f5f476e6 100644 --- a/site/index.js +++ b/site/index.js @@ -4,6 +4,7 @@ import './index.less'; import 'nprogress/nprogress.css'; import 'highlight.js/styles/solarized-light.css'; import Vue from 'vue'; +import Vuex from 'vuex'; import VueI18n from 'vue-i18n'; import VueRouter from 'vue-router'; import VueClipboard from 'vue-clipboard2'; @@ -28,6 +29,7 @@ const mountedCallback = { }, }; +Vue.use(Vuex); Vue.use(mountedCallback); Vue.use(VueClipboard); Vue.use(VueRouter); @@ -56,8 +58,21 @@ router.beforeEach((to, from, next) => { } next(); }); + +const store = new Vuex.Store({ + state: { + username: 'zeka', + }, + mutations: { + update(state, payload) { + state.username = payload.username; + }, + }, +}); + new Vue({ el: '#app', i18n, router, + store, });