最终效果如下图,没填的会报空,填了的则正常

 

弹窗代码如下(直接复制肯定跑不了,自己设计一个按钮添加点击事件改变dialogAddVisible来显示)

title="新增敏感词"

centered

:width="864"

:visible="dialogAddVisible"

:confirm-loading="confirmLoading"

ok-text="确认"

@ok="onSubmit"

@cancel="dialogAddVisible = false"

>

ref="word"

:prop="`word[${index}]`"

:rules="{ required: true, message: '敏感词不能为空', trigger: 'blur' }"

>

:prop="`typee[${index}]`"

:rules="{ required: true, message: '敏感词不能为空', trigger: 'blur' }"

>

{{ item.type }}

部分使用到的data或者方法如下,拷贝进去可能不能运行,主要是分享一下思路。

每需要添加一行就往table的datasource里添加一个空数据站位字,使得表格多出一行,而重点是如何准确的获取每一行的数据并且监听和校验呢?

我设计的form叫addForm,里面的word和type是个数组,专门存对应的数据。在a-form-model里使用:form=“addForm”。重点来了,a-form-model-item的prop属性,这个我观察了官网的例子,发现,prop需要赋一个字符串,字符串的内容是form的属性,在这里,form的属性则是word和type这两个数组,又因为我有许多输入框,我用的是数组来对应那些输入框。所以prop应该是动态的,(每个输入框的prop不一样嘛),则写出了:prop="`word[${index}]`"。让prop等于word[0]/word[1]/word[2]这样。而input中的v-model也是对应着那个数据。从而达到了校验表单的效果

export default {

name: 'Sensitive',

data() {

return {

template: {

key: 1,

word: '',

type: '',

opreate: '',

},

dataSource: [],

dialogAddVisible: false,

tempItem: {

word: '',

type: '',

},

addForm: {

word: [],

typee: [],

},

rules: {

word: [{ required: true, message: '敏感词不能为空', trigger: 'blur' }],

typee: [{ required: true, message: '请填写类型', trigger: 'blur' }],

},

dialogEditVisible: false,

showColumns: [

{

title: '敏感词',

dataIndex: 'word',

width: 'auto',

key: 'name',

fontSize: 14,

},

{

title: '分类',

dataIndex: 'type',

key: 'age',

width: 320,

filters: [

{ text: '谩骂骚扰', value: '谩骂骚扰' },

{ text: '暴力言论', value: '暴力言论' },

{ text: '政治', value: '政治' },

{ text: '贩卖野生动物', value: '贩卖野生动物' },

{ text: '色情挑逗', value: '色情挑逗' },

{ text: '色情传播', value: '色情传播' },

{ text: '广告引流', value: '广告引流' },

],

onFilter: (value, record) => {

// 这里要设置一下分页器的总数

return record.type == value

},

},

{

title: '操作',

dataIndex: 'opreate',

key: 'opreate',

ellipsis: true,

width: 112,

scopedSlots: { customRender: 'opreate' },

},

],

addColumns: [

{

title: '数量',

dataIndex: 'key',

width: 80,

key: 'key',

fontSize: 14,

},

{

title: '敏感词',

dataIndex: 'word',

width: 320,

key: 'name',

fontSize: 14,

scopedSlots: { customRender: 'word' },

},

{

title: '分类',

dataIndex: 'type',

key: 'age',

width: 320,

scopedSlots: { customRender: 'type' },

},

{

title: '操作',

dataIndex: 'opreate',

key: 'opreate',

ellipsis: true,

width: 80,

scopedSlots: { customRender: 'opreate' },

},

],

typeOption: [

{ type: '谩骂骚扰', id: 1 },

{ type: '暴力言论', id: 2 },

{ type: '政治', id: 3 },

{ type: '贩卖野生动物', id: 4 },

{ type: '色情挑逗', id: 5 },

{ type: '色情传播', id: 6 },

{ type: '广告引流', id: 7 },

],

dialogPvVisible: false,

}

},

created() {

// 深拷贝一份进去

this.dataSource.push(JSON.parse(JSON.stringify(this.template)))

},

methods: {

// 判断删除状态,如果只有一项则不可操作,反之亦然

judgeAvailable() {

console.log('asd')

if (this.dataSource.length == 1) {

let deleteBTN = document.getElementsByClassName('removeRowBTN')[0]

deleteBTN.style.cursor = 'not-allowed'

deleteBTN.style.color = 'grey'

deleteBTN.style.pointerEvents = 'none'

} else {

var x = document.getElementsByClassName('removeRowBTN')

var i

for (i = 0; i < x.length; i++) {

x[i].style.cursor = 'pointer'

x[i].style.color = '#3370ff'

x[i].style.pointerEvents = 'all'

}

}

},

showAddDialog() {

this.dialogAddVisible = true

this.$nextTick(() => {

this.judgeAvailable()

})

},

addRow() {

let obj = JSON.parse(JSON.stringify(this.template))

obj.key = this.dataSource[this.dataSource.length - 1].key + 1

this.dataSource.push(obj)

console.log(this.addForm)

this.judgeAvailable()

},

// 新增敏感词的校验

onSubmit() {

this.$refs.addForm.validate((valid) => {

if (valid) {

console.log(this.dataSource)

console.log(this.addForm)

alert('submit!')

} else {

console.log('error submit!!')

console.log(this.dataSource)

console.log(this.addForm)

console.log(typeof this.addForm.typee[0])

return false

}

})

},

showEditWordDialog(text, record) {

this.dialogEditVisible = true

this.$nextTick(() => {

this.editForm.setFieldsValue({ editSensitiveWord: record.word })

this.editForm.setFieldsValue({ editType: record.type })

})

},

// 新增敏感词

handleAddWord() {},

showEditDialog(text, record) {

console.log(text, record)

},

handleDeleteAdd(text, record) {

const h = this.$createElement

console.log(text, record)

this.$confirm({

title: `你确认要删除【${record.word}】敏感词吗`,

okText: '确认',

cancelText: '取消',

centered: true,

icon: () =>

h('img', {

attrs: {

src: require('../../assets/images/alert.png'),

},

style: {

'vertical-align': 'baseline',

display: 'inline',

float: 'left',

'margin-right': '17px',

},

}),

onOk: () => {

console.log('确认删除新增项')

this.dataSource.splice(record.key - 1, 1)

if (this.dataSource.length == 1) {

// 设置为不可用

this.judgeAvailable()

return

}

// 这里发送删除的请求,不过需要key,等后端的数据吧

},

})

},

},

参考阅读

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。