1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
| <template>
| <j-modal :visible="visible" :confirmLoading="loading" :after-close="afterClose" v-bind="modalProps" @ok="onOk" @cancel="onCancel">
| <a-spin :spinning="loading">
| <div v-html="content"></div>
| <a-form-model ref="form" :model="model" :rules="rules">
| <a-form-model-item prop="input">
| <a-input ref="input" v-model="model.input" v-bind="inputProps" @pressEnter="onInputPressEnter"/>
| </a-form-model-item>
| </a-form-model>
| </a-spin>
| </j-modal>
| </template>
|
| <script>
| import pick from 'lodash.pick'
|
| export default {
| name: 'JPrompt',
| data() {
| return {
| visible: false,
| loading: false,
| content: '',
| // 弹窗参数
| modalProps: {
| title: '',
| },
| inputProps: {
| placeholder: '',
| },
| // form model
| model: {
| input: '',
| },
| // 校验
| rule: [],
| // 回调函数
| callback: {},
| }
| },
| computed: {
| rules() {
| return {
| input: this.rule
| }
| },
| },
| methods: {
| show(options) {
| this.content = options.content
| if (Array.isArray(options.rule)) {
| this.rule = options.rule
| }
| if (options.defaultValue != null) {
| this.model.input = options.defaultValue
| }
| // 取出常用的弹窗参数
| let pickModalProps = pick(options, 'title', 'centered', 'cancelText', 'closable', 'mask', 'maskClosable', 'okText', 'okType', 'okButtonProps', 'cancelButtonProps', 'width', 'wrapClassName', 'zIndex', 'dialogStyle', 'dialogClass')
| this.modalProps = Object.assign({}, pickModalProps, options.modalProps)
| // 取出常用的input参数
| let pickInputProps = pick(options, 'placeholder', 'allowClear')
| this.inputProps = Object.assign({}, pickInputProps, options.inputProps)
| // 回调函数
| this.callback = pick(options, 'onOk', 'onOkAsync', 'onCancel')
| this.visible = true
| this.$nextTick(() => this.$refs.input.focus())
| },
|
| onOk() {
| this.$refs.form.validate((ok, err) => {
| if (ok) {
| let event = {value: this.model.input, target: this}
| // 异步方法优先级高于同步方法
| if (typeof this.callback.onOkAsync === 'function') {
| this.callback.onOkAsync(event)
| } else if (typeof this.callback.onOk === 'function') {
| this.callback.onOk(event)
| this.close()
| } else {
| this.close()
| }
| }
| })
| },
| onCancel() {
| if (typeof this.callback.onCancel === 'function') {
| this.callback.onCancel(this.model.input)
| }
| this.close()
| },
|
| onInputPressEnter() {
| this.onOk()
| },
|
| close() {
| this.visible = this.loading ? this.visible : false
| },
|
| forceClose() {
| this.visible = false
| },
|
| showLoading() {
| this.loading = true
| },
| hideLoading() {
| this.loading = false
| },
|
| afterClose(e) {
| if (typeof this.modalProps.afterClose === 'function') {
| this.modalProps.afterClose(e)
| }
| this.$emit('after-close', e)
| },
|
| },
| }
| </script>
|
| <style scoped>
|
| </style>
|
|