vue 中同一个页面中 ,在一个全局放大图片组件,多次操作放大后,另一个组件表单元素不可编辑
//受 全局ts-image-viewer 放大控件影响,导致表单元素不能编辑了,很怪异的问题, 原因分析,全局图片放大组件在操作后,影响另一个全局组件的内部属性,
本来的写法没有使用 form 包裹 表元素input, 会出现这样的问题
在改为 ui控件 form 包裹后,可以使用form的 注册代码和重置表单元素的功能(如下 如上 几行代码), 至此再无此问题
(如下)
fields.forEach(v => this.form.getFieldDecorator(v))
// 当 model 发生改变时,为表单设置值
this.$watch('editValue', () => {
let obj = pick(this.editValue, fields)
this.model && this.form.setFieldsValue(obj)
})
(如上)
<ts-image-viewer
:urlList="imgList"
:initialIndex="imgIndex"
v-if="visibleImg"
@close="
() => {
this.visibleImg = false
}
"
></ts-image-viewer>
</div>
</template>
<script>
import QuillEditor from '../../../../components/Editor/QuillEditorForm'
import {TsImageViewer } from '@/components'
改为 vue ant form 控件,
// 防止表单未注册
fields.forEach(v => this.form.getFieldDecorator(v))
// 当 model 发生改变时,为表单设置值
this.$watch('editValue', () => {
let obj = pick(this.editValue, fields)
this.model && this.form.setFieldsValue(obj)
})
//这几行代码很重要
<template>
<div>
<a-modal id="ReportList"
:visible="visible"
:title="title"
:confirmLoading="loading"
@cancel="() => {
$emit('cancel')
}">
<a-spin :spinning="loading">
<div>
<span class="noteSpan">* </span>
<span>巡查记录</span>
<span class="noteCont" v-show="hasTextData"> ( 请填写巡查记录 )</span>
<!-- v-if="visible" 该指令 可保证组件初始化,不会遗留上次编辑的内容-->
<!-- v-model="overallHtmlValue" -->
<a-form :form="form" ref="dataForm">
<a-form-item label="">
<QuillEditor
v-if="visible"
class="quillHeight"
:value="overallHtmlValue"
isEditorChange="1"
:class="overallDisabled?'quillbackcolor':''"
:editorOption="editorOption"
@changeCallBack="overallChange"
></QuillEditor>
</a-form-item>
</a-form>
<!-- <QuillEditor
v-if="visible"
class="quillHeight"
:value="overallHtmlValue"
isEditorChange="1"
:class="overallDisabled?'quillbackcolor':''"
:editorOption="editorOption"
@changeCallBack="overallChange"
></QuillEditor> -->
</div>
<div>
<span>现场图片</span><span style="color:#9f9c9c"> ( 支持格式:.png、.jpg( .jpeg)、 .bmp ,支持同时上传多张图片 )</span>
<!-- :fileArray="showUpModel.fileArray" 为上传数组图片 -->
<UpFile
v-if="visible"
:fileStyleCont="showUpModel.fileStyleCont"
:fileStyleArr="showUpModel.fileStyleArr"
:fileArray="showUpModel.fileArray"
:upText="showUpModel.upText"
@upFileData="getFileData"
@getFlag="getFlag"
>
</UpFile>
</div>
</a-spin>
<template slot="footer">
<a-button @click="cancel">取消</a-button>
<a-button type="primary"
:diabled="disabledFlag"
@click="saveOk" >{{title==='替换'?'替换':'保存'}}</a-button>
</template>
</a-modal>
</div>
</template>
<script>
import QuillEditor from '../../../../components/Editor/QuillEditorForm'
import UpFile from '@/components/UpFile/UpFile'
const fields = ['overallHtmlValue']
export default {
components: {
QuillEditor,
UpFile
},
props: {
visible: {
// 组件显示
type: Boolean,
default: false,
},
title: {
// 模块名称
type: String,
default: "",
},
width: {
// 窗口宽度
type: Number,
default: 60,
},
loading: {
type: Boolean,
default: () => false,
},
RiskPointId: {
// 风险点id
type: String,
default: "",
},
editValue:{
type: String,
default: "",
},
text:{//文本内容
type: String,
default: "",
},
VueUploadModels:{
type:Array,
default:[]
},
siteId: {
// 工点id
type: String,
default: "",
},
disabledFlag: {
type: Boolean,
default: false
},
},
data() {
return {
form: this.$form.createForm(this),
editorOption: {
debug: 'info',
placeholder: '请输入',
modules: {
toolbar: [
['bold', 'italic', 'underline', 'strike'],
[{ align: [] }],
[{ list: 'ordered' }, { list: 'bullet' }],
[{ indent: '-1' }, { indent: '+1' }],
[{ script: 'sub' }, { script: 'super' }],
[{ font: [] }],
,
[{ size: ['small', false, 'large', 'huge'] }],
[{ color: [] }, { background: [] }]
]
}
},
hasTextData:false,
overallDisabled:false,
overallHtmlValue:'',//内容
overallHtml: '',//内容html
overallText: '',
showUpModel:{
btnTitle:'上传',//按钮名字
fileStyleCont:'文件支持.doc, 不能超过100M',//格式描述
fileStyleArr:['.png','.jpg','.jpeg','.bmp',
'PNG','JPG','JPEG','BMP'
],//写你自己的上传文件类型,注意大小写都要写
fileArray:[],//替换时显示使用
upText:'上传现场图片',//上传按钮文本
},
fileData:[],//文件对象
flag:false,//判断是否进行了图片操作(删除和上传)
}
},
watch:{
// editValue(newName, oldName) {
// console.log('newname',newName)
// if(this.title==="替换"){
// this.overallHtmlValue = newName;
// this.overallHtml = newName;//内容html
// this.overallText = this.text;
// }else{
// this.overallHtmlValue = '';
// this.overallHtml = '';//内容html
// this.overallText = '';
// }
// }
},
created(){
// 防止表单未注册
fields.forEach(v => this.form.getFieldDecorator(v))
// 当 model 发生改变时,为表单设置值
this.$watch('editValue', () => {
let obj = pick(this.editValue, fields)
this.model && this.form.setFieldsValue(obj)
})
if(this.title==="替换"){
this.overallHtmlValue = this.editValue;
this.overallHtml = this.editValue;//内容html
this.overallText = this.text;
this.showUpModel.fileArray = this.VueUploadModels;//回显图片
}else{
this.overallHtmlValue = '';
this.overallHtml = '';//内容html
this.overallText = '';
}
},
methods: {
overallChange(html, text) {
this.overallHtml = html //给父级传htmlStr
this.overallText = text //给父级传内容
console.log('text',text)
if(this.overallText.length===0||this.overallText==='\n'){
this.hasTextData = true;
}else{
this.hasTextData = false;
}
},
// 上传图片
// <!-- 上传后回调事件 -->
getFileData(fileData){
// console.log('fileData',fileData)
this.fileData = fileData;
},
getFlag(e){
this.flag = e;
},
cancel(){
this.$emit('cancel')
this.overallHtml = '';
this.overallText = '';
},
saveOk(){
// 如果没有填写不能保存
if(this.overallText.length===0||this.overallText==='\n'){
this.hasTextData = true;
return
}
var obj =
{
htmlValue:this.overallHtml,//回传两个参数 1标签内容 2 文本内容
textValue:this.overallText,
// fileArray:this.fileData,//图片数组
};
if(this.title==='替换'){
if(this.flag){
obj.fileArray = this.fileData//操作了图片,回传的对象,
}else{
obj.fileArray = [];
this.VueUploadModels.forEach(item => {
var objItem = item.response;
var itemData = {
FileId: objItem.FileId,
FileNewName: objItem.FileNewName,
FileOldName: objItem.FileOldName,
FileSize: objItem.FileSize,
FileType: objItem.FileType,
Url: objItem.Url
};
obj.fileArray .push(itemData)
});
}
}else{
obj.fileArray = this.fileData
}
// return
this.$emit('submit',obj)
this.overallHtmlValue = "";
//保存后就清空
this.overallHtml = '';
this.overallText = '';
},
},
}
</script>
<style>
.quillHeight .quill-editor {
height: 258px!important;
}
</style>
<style scoped>
.noteSpan,.noteCont {
color:red;
}
.titleSpan {
margin-left:6px;
margin-right:6px;
}
.quillHeight {
margin-top:10px;
width:100%;
height: 300px;
}
.quillbackcolor {
background-color: #ddd;
}
</style>

浙公网安备 33010602011771号