编写时候注意的东西

1 父组件通过props传递异步数据,子组件接收

https://blog.csdn.net/shsyzhzhgn/article/details/138124529

2 点1有邮箱,点2 没有邮箱返回

在这里插入图片描述

props接收不到数据,不会变化

用watch接的话, 如果没有发生变化(同一个邮箱), 不会更新下一个数据

在这里插入图片描述

加定时器,获取到在props

在这里插入图片描述

在这里插入图片描述

3 计算属性

props拿到就可以用计算属性吗

在这里插入图片描述

在这里插入图片描述

4 什么时机下用computed

在这里插入图片描述

计算属性 ,只能监听基本数据类型,不能监听引用数据类型,

监听引用数据类型用watch

5 清零

点启动的时候,没有吧taskForm.value.estimateConsumeUse 清空

下次进入的时候taskForm.value.estimateConsumeUse = 2 。再调一遍变成4

======》 取消,上一步,启动 都要清除!!!

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

响应式数据多会 一直存在吗?

6 想修改props 数据,怎么修改

props里边是个form. 用v-model = “form” 会报错

用watch也不对

编辑

后改成:打开弹框传进去

在这里插入图片描述

在这里插入图片描述

错误思路:

1 dept不能修改, 用watch监听一下:赋值给新的变量进行修改,

问题: currentDept 发生改变, depth也发生了改变,因为是浅拷贝, 用了json.pase(json.stringify(value))

还有问题: 修改后,取消,再点进去,发现currentpet 还是变化后的值,

因为watch监听dept,你在进入编辑弹框,还是没有变化,不会重新赋值给currentDept。导致currentDept还是变化后的值

解决:

发生改变的值(currentDept),不用watch,

如果不改变,可以用computed

在这里插入图片描述

在这里插入图片描述

<template>
  <div class="selectDrawer">
    <Drawer title="编辑部门" ref="drawer" size="40%">
      <!-- 内容 -->
      <template #content>
        <!-- 条件 -->
        <el-form :model="currentDept" label-position="top" :rule="deptRules" ref="deptRef">
          <el-form-item label="部门名称" prop="name">
            <el-input v-model="currentDept.name" placeholder="请输入" />
          </el-form-item>
          <el-form-item label="部门主管" @click="openPerson">
            <div class="leader">
              <div class="leader_name" v-if="Object.keys(choosePerson).length === 0">请选择</div>
              <el-tag v-else closable @close="deletePerson">{{ choosePerson[0].userName }}</el-tag>
              <div class="leader_icon"
                ><el-icon color="#A8ABB2"><ArrowDown /></el-icon>
              </div>
            </div>
          </el-form-item>
          <el-form-item label="上级部门">
            <el-select v-model="currentDept.parentId" placeholder="请选择">
              <el-option
                v-for="item in parentDept"
                :key="item.deptId"
                :label="item.name"
                :value="item.deptId"
              />
            </el-select>
          </el-form-item>
          <el-form-item label="部门描述">
            <el-input
              v-model="currentDept.description"
              maxlength="300"
              :rows="5"
              type="textarea"
              show-word-limit
              placeholder="请输入描述信息"
            />
          </el-form-item>
        </el-form>
      </template>
      <!-- 按钮 -->
      <template #foot_button>
        <el-button @click="handleClose">取消</el-button>
        <el-button type="primary" @click="editDept($parent)">保存</el-button>
      </template>
    </Drawer>
  </div>

  <!-- 选人框 -->
  <ChoosePersonDraw
    ref="chosePersonDrawer"
    @select_person="selectPerson"
    :defaultSelected="choosePerson"
  />
</template>

<script lang="ts" setup>
import { ref } from "vue"
import DeptAPI from "@/api/dept/index.ts"
import Drawer from "@/components/common/Drawer.vue"
import ChoosePersonDraw from "@/components/common/ChoosePersonDraw.vue"
import { ArrowDown } from "@element-plus/icons-vue"

const props = defineProps({
  dept: {
    type: Object,
    default: () => {}
  }
})

const currentDept = ref<any>([])
watch(
  () => props.dept,
  (value) => {
    currentDept.value = JSON.parse(JSON.stringify(value))
  },
  { deep: true }
)

/** 删除人员 */
const deletePerson = () => {
  choosePerson.value = {}
}

/** 打开选人框 */
const chosePersonDrawer = ref<InstanceType<typeof ChoosePersonDraw> | null>(null)
const openPerson = () => {
  chosePersonDrawer.value?.selectOpen()
}

/** 查询上级部门 */
const parentDept = ref<any>([])
const selectParentDept = async () => {
  try {
    const res = await DeptAPI.queryParentDept()
    parentDept.value = res.data
  } catch (error: any) {
    console.log(error)
    if (!error.msg || error.msg != "") {
      ElMessage.error(error.msg)
    }
  }
}

/** 获取人员 */
const choosePerson = ref<any>([])
const selectPerson = (singlePerson: any) => {
  choosePerson.value = []
  choosePerson.value.push({ userName: singlePerson[0].name, id: singlePerson[0].userId })
  console.log(choosePerson.value)
  currentDept.value.leaderId = singlePerson.id
}

/** 校验 */
const deptRules = {
  name: [{ required: true, message: "部门名称不能为空", trigger: "change" }]
}

/** 编辑 */
const deptRef = ref()
const editDept = async (parent: any) => {
  try {
    await deptRef.value.validate()
    await DeptAPI.editDept(currentDept.value)
    drawer.value?.isClose()
    ElMessage({
      message: "添加角色成功",
      type: "success"
    })
    parent.getDeptList()
  } catch (error: any) {
    if (!error.msg || error.msg != "") {
      ElMessage.error(error.msg)
    }
  }
}

/** el-drawer 展开关闭 */
// 关闭
const drawer = ref<InstanceType<typeof Drawer> | null>(null)
const handleClose = () => {
  drawer.value?.isClose()
}

// 打开
const selectOpen = () => {
  //查询部门列表
  selectParentDept()
  drawer.value?.isOpen()
}
defineExpose({
  selectOpen
})
</script>

<style lang="scss" scoped>
// 主管
.leader {
  width: 100%;
  height: 32px;
  background: #ffffff;
  border: 1px solid #dcdfe6;
  border-radius: 4px;
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 0px 12px;
  .leader_name {
    font-family: PingFangSC-Regular;
    font-weight: 400;
    font-size: 14px;
    color: #a8abb2;
  }
}

// 修改el-form-item 字体
:deep(.el-form--default.el-form--label-top .el-form-item .el-form-item__label) {
  font-family: PingFangSC-SNaNpxibold;
  font-weight: 600;
  font-size: 14px;
  color: #333333;
}
:deep(.el-textarea .el-input__count) {
  color: #a8abb2;
}
</style>

6.1 修改

localFormData 能拿到数据吗?

在这里插入图片描述

这么写是浅拷贝,拷贝的是引用地址,一个变化其他也跟着变化

这要写深拷贝Json.parse(json.stringfi(props.formData))

7加载页面

父组件然后完毕,子组件是不是也渲染完毕

8

dom更新是异步的,他没初始化你就执行逻辑就会导致,加上个setTimeout或者await nextTick()就行

在这里插入图片描述

调试:

点击发现 props.emailValue没有变化,变化的慢

加一个setTimeout

在这里插入图片描述

在这里插入图片描述

看父组件是否获取到值,和子组件是否接受到

父组件没有获取到值是逻辑问题, 子组件没有接收到可能是异步操作,加一个nextTick

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值