antd
修改 a-table 表头
试了很多错 最后终于实现了(一定得外边使用
:deep,针对 vue3)
:deep(.ant-table-container table > thead > tr) {
th {
background-color: whitesmoke;
}
}
文件导入参数问题
- 当导入文件的接口中需要添加多个参数时:需要通过 formData.append(‘参数’,值) 把参数以及值逐步添加进去。
const formData = new FormData()
formData.append('参数1',参数1对应值)
formData.append('参数2',参数2对应值)
- 设置请求体
importCtrApi = () => {
return post({
url: IMPORT_CTR,
formData,
})
}
- 再设置请求头
headers:{
'Content-Type': 'multipart/form-data',
}
不能直接给 reactive 赋值
- 之前在开发时候遇到一个问题:我用一个 reactive 包裹的对象来确定一个图标是否显示隐藏,在一个切换操作中我直接把这个对象赋值为
{}最后导致在点击切换的时候,数据发生改变,但是视图更新出现了问题,鼠标点击按钮切换,如果鼠标光标一直在改图标,视图永远不更新,只要光标移除图标,按钮图标就会更新。
//问题数据
const badData = reactive({})
badData = {} //这样赋值不规范,会破坏reactive的响应式,因为reactive是使用poxy进行代理,如果直接赋值就破坏了poxy
//正确做法
const badData = reactive({
name: '',
})
badData.name = '***'
antd 树形结构(a-tree)配置说明
dropToGap(boolean)
表示是否拖动到了节点之间缝隙,true代表拖动到节点之间的缝隙,反之为false,则是拖动到节点内部
dropPosition(number)
表示拖动到的当前节点的相对位置
- 当拖动到目标元素上面缝隙:dropPosition= 目标元素相对(相对父节点的索引)位置,例如:想要插入到第三个元素(index=2)之前,那么dropPosition=2,相当于插入,把原来第三个元素的位置占用,此时dropToGap=true
- 当拖动元素到目标元素下面缝隙:dropPosition= 目标元素相对(相对父节点的索引)位置+1,例如:想要插入到第三个元素(index=2)之后,那么dropPosition=3,此时dropToGap=true
- 当拖动元素到目标元素之内:dropPosition= 目标元素内容相对(相对父节点的索引)位置,例如:想要插入到第三个元素(index=2)之内,那么dropPosition=2,此时dropToGap=false
!!封装简易的s-table
antd-select失去焦点问题,
<div>
<a-select
autofocus
defaultOpen
v-if="column.key === 'policy'"
v-model:value="editData[record.id].policy"
class="w-full"
@blur="onCancleSelect"
@dropdownVisibleChange="(open:boolean)=>onDrop(open,record.policy,editData[record.id].policy)"
>
<a-select-option
v-for="option in record.policyRange"
:key="option"
:value="option"
>
<span :title="option"></span>
</a-select-option>
</a-select>
<a-select
autofocus
defaultOpen
v-if="column.key === 'value' && record.isEnumValueType"
v-model:value="editData[record.id].value"
class="w-full"
@blur="onCancleSelect"
@dropdownVisibleChange="(open:boolean)=>onDrop(open,record.value,editData[record.id].value)"
>
<a-select-option
v-for="option in record.valueRange"
:key="option"
:value="option"
>
<span :title="option"></span>
</a-select-option>
</a-select>
<a-input
v-click-outside:record="{ editData, record, indexName: '' }"
v-show="column.key === 'value' && !record.isEnumValueType"
v-model:value="editData[record.id].value"
@blur.prevent="onBlur"
/>
</div>
其中可以看到每个组件都会有blur失去焦点事件,并且这些组件都在一个div中通过条件判断(v-show)其显示隐藏。
- 如果用v-show会出现问题:当我双击输入框对应文本想要修改输入框内的内容时,默认我让输入框出现之后聚焦在文内,如果再一次点击焦点处,会再一次触发失去焦点的事件,但是我点击的焦点内部,并没有失去焦点,百思不得其解,然后我把该输入框的失去焦点事件去除之后,发现点击输入框内部还是会触发焦点失去事件。
- 这个失去焦点的事件其实是我通过v-show隐藏的其他组件的焦点失去事件,导致点击输入框的内部其实是点击了其他组件的失去焦点,所有会这样子,因此让元素显示隐藏不能用v-show实现,只能让元素销毁或者创建这样每次只会触发一个元素的事件,因此用v-if。