vue3中的一些便捷写法记录

vue2+vue3 本博客主要为coderwhy的Vue2网课 + 尚硅谷Vue2+Vue3网课,所整理记录的学习笔记,仅作学习用途,如有侵权,烦请联系本人侵删。同时感谢黑马、尚硅谷老师们的辛苦教导付出,如有不足之处,欢迎各位小伙伴、官老爷们多多提意见或建议,感谢! 阅读详情

1、子组件触发父组件事件

<template>
  <div class="father">
    <h3>父组件,</h3>
		<h4>儿子给的玩具:{{ toy }}</h4>
		<Child :car="car" @getToy="getToy"/>
  </div>
</template>

<script setup lang="ts" name="Father">
	import Child from './Child.vue'
	import { ref } from "vue";
	// 数据
	const toy = ref()
	// 方法
	function getToy(value:string){
		toy.value = value
	}
</script>
<template>
  <div class="child">
    <h3>子组件</h3>
		<h4>我的玩具:{{ toy }}</h4>
		<button @click="handleToy">玩具给父亲</button>
  </div>
</template>

<script setup lang="ts" name="Child">
	import { ref } from "vue";
	const toy = ref('奥特曼')
	
	const emit = defineEmits(["getToy"]);
    const handleToy = (type: number, orgId: number) => {
      emit("getToy", toy);
    };
</script>

2、公共Hooks函数封装(强烈建议好好看下,使用起来很方便)

2.1、table公共方法封装(table列表、分页、搜索、删除、状态修改)
// composables/useCommon.js文件内
import { ref, reactive, computed } from "vue";
import { message } from "@/composables/util.js";
import { ElMessageBox } from "element-plus";
// 公共table接口
interface TableOptions {
  // 搜索参数
  searchForm?: object;
  // api文件内的接口
  getList: Function;
  // 获取数据后对数据进行处理的回调
  // 注:(如果需要对列表的回调数据进行特殊处理就需要传,只是列表渲染就不需要传这个)
  onGetListSuccess?: Function;
  // 启用
  enableStatus?: Function;
  // 禁用
  disableStatus?: Function;
  // 删除
  delete?: Function;
}

// 复选框接口
interface idOptions {
  id: number;
}

// 公共逻辑拆分(分页+列表+删除+搜索+修改状态)
// opt参数 必传:getList(获取列表数据的接口)
// 选传:searchForm(搜索参数)、updateStatus(修改状态的接口)、
// delete(删除状态的接口)、onGetListSuccess(获取数据后对数据进行处理的回调)
export function useInitTable(opt: TableOptions) {
  const tableData = ref([]);
  const loading = ref(false);
  // 分页参数
  const currentPage = ref(1);
  const limit = ref(10);
  const total = ref(0);
  // 搜索
  let searchForm = null;
  let resetSearchForm = null;

  // 搜索参数可能会有多个,需要使用组件传递对应搜索参数,公共组件动态获取
  if (opt.searchForm) {
    searchForm = reactive({ ...opt.searchForm });

    resetSearchForm = () => {
      // opt.searchForm的格式searchForm: {keyword: ''},使用组件传的值必定为空,循环给searchForm初始化值
      for (const key in opt.searchForm) {
        searchForm[key] = opt.searchForm[key];
      }

      getData();
    };
  }
  // 分页
  const handleSizeChange = (pageSize: number) => {
    searchForm.pageSize = pageSize;
    getData();
  };
  const handleCurrentChange = (currentPage: number) => {
    console.log(currentPage, "currentPage");
    searchForm.pageNum = currentPage;
    getData();
  };
  const getData = async (p = null) => {
    // p为当前页码数
    if (typeof p == "number") {
      currentPage.value = p;
    }
    loading.value = true;
    // const res = await opt.getList(currentPage.value, searchForm);
    const queryParams = {};
    for (const key in searchForm) {
      if (searchForm[key]) {
        queryParams[key] = searchForm[key];
      }
    }
    const res = await opt.getList(queryParams);
    if (res.code === 200) {
      // 部分组件需要返回特殊的参数,如:每个item中都要返回一个checked属性,那么将执行使用组件传来的逻辑,返回对应参数
      if (opt.onGetListSuccess && typeof opt.onGetListSuccess == "function") {
        opt.onGetListSuccess(res);
      } else {
        console.log(res, "res");
        tableData.value = res.data.list;
        total.value = res.data.total;
      }
    }
    loading.value = false;
  };
  getData();
  // 启用
  const handleEnable = async (id: number) => {
    try {
      await opt.enableStatus(id);
      message("启用成功", { type: "success" });
      getData();
    } catch (err) {
      console.log(err, "err");
    }
  };
  // 禁用
  const handleDisable = async (id: number) => {
    try {
      await opt.disableStatus(id);
      message("禁用成功", { type: "success" });
      getData();
    } catch (err) {
      console.log(err, "err");
    }
  };
  // 删除
  const handleDelete = async (ids: object) => {
    loading.value = true;
    try {
      // 弹出确认框
      ElMessageBox.confirm("是否删除此字典类型?", "提示", {
        distinguishCancelAndClose: true,
        confirmButtonText: "确定",
        cancelButtonText: "取消"
      })
        .then(async () => {
          // 用户点击确定按钮的处理逻辑
          await opt.delete({ ids }).then(res => {
            if (res.code === 200) {
              message("删除成功", { type: "success" });
              getData();
              return;
            } else {
              message(res.message, { type: "error" });
              return;
            }
          });
        })
        .catch(() => {
          // 用户点击取消按钮的处理逻辑
          message("已取消操作", { type: "info" });
        });
    } catch (err) {
      loading.value = false;
    }
  };

  // 复选框多选选中id
  const multiSelectionIds = ref([]);
  const handleSelectionChange = (e: Array<object>) => {
    const ids = e.map((o: idOptions) => {
      return o.id;
    });
    multiSelectionIds.value = ids;
  };
  // 批量删除
  // const multipleTableRef = ref(null);
  const handleMultiDelete = () => {
    if (!multiSelectionIds.value.length)
      return message("请选择至少一个选项", { type: "info" });
    try {
      const params = {
        ids: multiSelectionIds.value.join()
      };
      ElMessageBox.confirm("是否删除选中的字典类型?", "提示", {
        distinguishCancelAndClose: true,
        confirmButtonText: "确定",
        cancelButtonText: "取消"
      })
        .then(async () => {
          // 用户点击确定按钮的处理逻辑
          await opt.delete(params).then(res => {
            if (res.code === 200) {
              message("删除成功", { type: "success" });
              getData();
              return;
            } else {
              message(res.message, { type: "error" });
              return;
            }
          });
        })
        .catch(() => {
          // 用户点击取消按钮的处理逻辑
          message("已取消操作", { type: "info" });
        });
    } catch (err) {
      console.log(err, "err");
    }
  };
  // 批量修改状态
  const handleMultiStatusChange = async (status: string) => {
    if (!multiSelectionIds.value.length)
      return message("请选择至少一个选项", { type: "info" });
    try {
      // await opt.updateStatus(multiSelectionIds.value, status);
      console.log(status, "status");
      message("修改状态成功", { type: "success" });
      getData();
    } catch (err) {
      console.log(err, "err");
    }
  };

  return {
    searchForm,
    resetSearchForm,
    tableData,
    limit,
    loading,
    total,
    currentPage,
    getData,
    handleDisable,
    handleEnable,
    handleDelete,
    handleSelectionChange,
    handleMultiDelete,
    handleMultiStatusChange,
    handleSizeChange,
    handleCurrentChange,
    multiSelectionIds
  };
}

使用table公共方法

<script setup lang="ts" name="EvaluateDetail">
// 公共table方法
import { useInitTable } from "@/composables/useCommon.js";
// table列表接口
import { getCategoryList } from "@/api/evaluate";
// 公共组件
import JmSearch from "@/components/JmSearch/index.vue";
import JmSearchItem from "@/components/JmSearchItem/index.vue";
import JmTable from "@/components/JmTable/index.vue";
import JmPagination from "@/components/JmPagination/index.vue";
// 搜索相关参数
const params = {
  patientName: "",
  userAccount: "",
  supportWorkerName: "",
  evaluateTime: [],
  evaluateTimeStart: "",
  evaluateTimeEnd: "",
  pageNum: 1,
  pageSize: 10,
  sortOrder: "desc"
};
const searchLabelList = [
  {
    key: "patientName",
    label: "就诊人姓名"
  },
  {
    key: "userAccount",
    label: "评价账号"
  },
  {
    key: "supportWorkerName",
    label: "护理人员"
  }
];
// 选择时间
interface DateType {
  [index: number]: string;
}
const handlePicker = (e: Array<DateType>) => {
  if (e && e.length > 0) {
    searchForm.evaluateTimeStart = e[0];
    searchForm.evaluateTimeEnd = e[1];
  } else {
    searchForm.evaluateTimeStart = "";
    searchForm.evaluateTimeEnd = "";
  }
};
// 公共方法table使用
const {
  tableData,
  getData,
  handleSizeChange,
  handleCurrentChange,
  resetSearchForm,
  total,
  searchForm
} = useInitTable({
  searchForm: params,
  // getCategoryList为table接口
  getList: getCategoryList
});
const tableColumns = [
  { prop: "supportWorkerId", label: "户工编号", width: "130" },
  { prop: "userAccount", label: "评价账号", width: "180" },
  { prop: "patientName", label: "就诊人姓名", width: "180" },
  { prop: "supportWorkerName", label: "护理人员", width: "180" },
  { prop: "orgName", label: "所属机构", width: "260" },
  { prop: "servicerNo", label: "服务单编号", width: "200", slot: "order" },
  {
    prop: "comprehensiveScore",
    label: "评价分值",
    width: "130",
    sortable: true
  },
  { prop: "detail", label: "查看", width: "200", slot: "actions" },
  { prop: "evaluateTime", label: "评价时间", width: "200" }
];

</script>

<template>
  <div>
    <!-- 搜索 -->
    <jm-search @search="getData" @reset="resetSearchForm" :model="searchForm">
      <jm-search-item
        v-for="(item, index) in searchLabelList"
        :key="index"
        :spanItem="5"
        :label="item.label"
      >
        <el-input
          v-model="searchForm[item.key]"
          :placeholder="item.label"
          clearable
        />
      </jm-search-item>
      <jm-search-item :spanItem="5" label="下单时间">
        <el-date-picker
          v-model="searchForm['evaluateTime']"
          type="daterange"
          range-separator="至"
          start-placeholder="开始日期"
          end-placeholder="结束日期"
          value-format="YYYY-MM-DD"
          @change="handlePicker"
        />
      </jm-search-item>
    </jm-search>
    <jm-table
      :initial-data="tableData"
      :columns="tableColumns"
      :showCheckbox="false"
      :height="'418'"
    />
    <!-- 分页组件 -->
    <jm-pagination
      @handleSizeChange="handleSizeChange"
      @handleCurrentChange="handleCurrentChange"
      :total="total"
    />
  </div>
</template>

<style lang="scss" scoped></style>
2.2、form表单公共方法封装(表单新增、修改、提交)
// composables/useCommon.js文件内
import { ref, reactive, computed } from "vue";
import { message } from "@/composables/util.js";
import { ElMessageBox } from "element-plus";
// 公共表单接口
interface FormOptions {
  // 表单参数
  form: object;
  rules?: object;
  title?: string;
  editId?: number;
  currentPage?: number;
  // 获取数据后对数据进行处理的回调
  // 编辑获取表单详情后的钩子
  // 注:页面中需要表单数据渲染的才需要传这个钩子,比如页面中有tag标签需要表单内容回显,但是不能直接用表单数据
  beforeGetForm?: Function;
  // 注:(如果需要对列表的回调数据进行特殊处理就需要传,只是列表渲染就不需要传这个)
  beforeSubmit?: Function;
  // 表单保存后的回调方法
  afterSubmit?: Function;
  // api文件内的接口
  // 详情
  detail?: Function;
  // 修改
  update?: Function;
  // 新增
  create?: Function;
  getData?: Function;
}
// 复选框接口
interface idOptions {
  id: number;
}

// 表单新增修改接口
interface FormDataOptions {
  code: number;
  data?: object;
}

// 表单(新增+修改+提交)逻辑拆分
// opt参数 必传:form(表单初始值)、
// 可选:title(表单标题)、currentPage(当前页:必须在useInitTable之后)、
// update(修改表单接口)、create(新增表单接口)
export function useInitForm(opt: FormOptions) {
  const formRef = ref(null);
  // 表单参数
  const defaultForm = opt.form;
  const form = reactive({});
  // 表单规则
  const rules = opt.rules || {};
  // 修改id
  const editId = ref(0);
  // 弹框title
  const drawerTitle = computed(() => {
    console.log("editId.value", editId.value);
    return editId.value ? "编辑" + opt.title : "新增" + opt.title;
  });

  // 重置表单
  const resetForm = (row = {}) => {
    if (formRef.value) formRef.value.clearValidate();
    for (const key in defaultForm) {
      form[key] = row[key];
    }
  };
  // // 新增
  // const handleCreate = () => {
  //   resetForm(defaultForm);
  // };
  // // 编辑
  // const handleEdit = () => {
  //   resetForm(defaultForm);
  // };
  if (opt.editId) {
    editId.value = opt.editId;
    // 是否有获取详情钩子
    if (opt.detail && typeof opt.detail == "function") {
      opt.detail(editId.value).then((res: FormDataOptions) => {
        if (res.code === 200) {
          // 是否需要对form数据进行特殊处理 详情见beforeGetForm接口介绍
          if (opt.beforeGetForm && typeof opt.beforeGetForm == "function") {
            opt.beforeGetForm(res);
          } else {
            resetForm(res.data);
          }
        }
      });
    }
  } else {
    resetForm(defaultForm);
  }
  // 提交表单
  const handleSubmit = () => {
    formRef.value.validate(async (valid: boolean) => {
      if (!valid) return false;
      console.log(form, "form");
      try {
        // 将form赋值给body,传给回调,处理时间戳
        let body = {};
        if (opt.beforeSubmit && typeof opt.beforeSubmit == "function") {
          body = opt.beforeSubmit({ ...form });
        } else {
          body = form;
        }

        const Fun = editId.value ? opt.update(body) : opt.create(body);
        // 修改刷新当前页,新增刷新第一页
        Fun.then((res: FormDataOptions) => {
          console.log(res, "res提交表单");
          if (res.code === 200) {
            message(drawerTitle.value + "成功", { type: "success" });
          } else {
            message(drawerTitle.value + "失败", { type: "warning" });
          }
          opt.afterSubmit(res);
        });
      } catch (err) {
        console.log(err);
      }
    });
  };
  return {
    formRef,
    form,
    rules,
    editId,
    drawerTitle,
    handleSubmit,
    resetForm
  };
}

使用form公共方法

<script setup lang="ts" name="AccountDetail">
import { ref, reactive } from "vue";
import { useInitForm } from "@/composables/useCommon.js";
import { getRoleLists } from "@/api/system";
import { RoleListsResult } from "@/api/type/system";
import {
  userAccountManageSave,
  userAccountResetPwd,
  userAccountDetail
} from "@/api/business";
const props = defineProps({
  pageType: {
    type: Number,
    default: 0
  },
  workerId: {
    type: Number,
    default: 0
  }
});

const formInit = {
  loginName: "",
  password: 12345678,
  roleId: "",
  roleName: "",
  userName: "",
  userId: 0
};
const selectKey = ref("roleId");
if (props.workerId) {
  selectKey.value = "roleName";
}
interface formOptions {
  code: number;
}
// 公共form方法使用
const { formRef, rules, handleSubmit, form } = useInitForm({
  editId: props.workerId,
  title: "账号",
  form: formInit,
  // userAccountManageSave、userAccountResetPwd、userAccountDetail都是相应的接口
  create: userAccountManageSave,
  update: userAccountResetPwd,
  detail: userAccountDetail,
  rules: {
    loginName: [{ required: true, message: "请输入账号名称", trigger: "blur" }],
    password: [{ required: true, message: "请输入账号名称", trigger: "blur" }],
    userName: [{ required: true, message: "请输入账号名称", trigger: "blur" }],
    roleId: [{ required: true, message: "请选择账号角色", trigger: "blur" }]
  },
  afterSubmit: (res: formOptions) => {
    if (res.code === 200) {
      changePage(1);
    }
  }
});

const roleList = reactive([]);
const getRoleListFn = () => {
  getRoleLists().then((res: RoleListsResult) => {
    if (res.code === 200) {
      const resInit = res.data.map(item => {
        return {
          roleId: item.roleId,
          roleName: item.roleName
        };
      });
      // 对象不能直接赋值,vue3检测不到
      roleList.push(...resInit);
    }
  });
};
getRoleListFn();
const emit = defineEmits(["open"]);
const changePage = (type: number, id?: number) => {
  // 实现打开页面的逻辑
  const val = {
    type,
    id
  };
  emit("open", val);
};
// onBeforeMount(() => {
//   getRoleListFn();
// });
</script>
<template>
  <div>
    <el-form
      :model="form"
      ref="formRef"
      :rules="rules"
      label-width="90px"
      :inline="false"
    >
      <el-form-item label="创建账号" prop="loginName">
        <el-input
          v-model="form['loginName']"
          max="20"
          placeholder="请输入创建账号"
          :disabled="pageType === 3 ? true : false"
        />
      </el-form-item>
      <el-form-item label="设置密码" prop="password">
        <el-input
          v-model="form['password']"
          max="60"
          placeholder="请输入设置密码"
        />
      </el-form-item>
      <el-form-item label="账号姓名" prop="userName">
        <el-input
          v-model="form['userName']"
          max="60"
          placeholder="请输入账号姓名"
          :disabled="pageType === 3 ? true : false"
        />
      </el-form-item>
      <el-form-item label="账号角色" prop="roleId" class="el-input">
        <el-select
          v-model="form[selectKey]"
          placeholder="城市运营"
          :disabled="pageType === 3 ? true : false"
        >
          <el-option
            v-for="(item, index) in roleList"
            :key="index"
            :label="item.roleName"
            :value="item.roleId"
          />
        </el-select>
      </el-form-item>
      <el-form-item>
        <el-button type="primary" @click="handleSubmit">{{
          props.workerId ? "编辑" : "创建"
        }}</el-button>
        <el-button @click="changePage(1)">取消</el-button>
      </el-form-item>
    </el-form>
  </div>
</template>
<style lang="scss" scoped>
:deep(.el-form-item__content) {
  flex: unset;
  width: 300px;
}
</style>

Vue学习记录之二十六 Vue3中跨域 跨域是浏览器出于安全考虑限制不同源之间资源请求的机制。通过 CORS、JSONP、代理等方式可以实现跨域通信。 阅读详情

相关推荐

数学建模 种群竞争模型 学习笔记

模型背景 应用场景 种群竞争模型 例如 s1=0.5,则表示对于供养甲的资源来讲,单位数量的乙的消耗为单位数量的甲的0.5倍,即表示乙对于该资源的占有能力是甲的0.5倍(即竞争力弱) 仿真结果及分析 (1)设置自然增长率 r1=r2=1 (2)改变自然增长率 r1=r2=0.3 (3)修改甲和乙的最大容量 n1=10000, n2=100 (4)修改甲和乙的初始数量 x1=10, x...

Test_tju的博客 2028

Vue3<script setup>——组件通信

Vue3 组件通信

weixin_42289080的博客 2433

从踩坑到填平:我在RHEL7上给Tesla A100装驱动的完整记录(含Fabric Manager配置)

本文详细记录了在RHEL7系统上为Tesla A100安装Nvidia驱动的完整过程,包括Fabric Manager配置的关键步骤。通过分析A100架构的特殊性,提供了从驱动安装到服务配置的详细指南,并分享了常见问题的排查方法和性能调优技巧,帮助用户高效部署高性能GPU计算环境。

weixin_29291863的博客 282

alibaba fastjson GET List传参 和 接收解析

之前一直都是 get传的都是单字符串(例如 xxxxxxxxx?),并没有传list的.

好好学习日记 644

NI-HIL学习开篇

自我介绍下,四年零部件厂工作经验,一年(至今)主机厂工作经验,负责BMS/VCU方向软硬件测试。 学习目的:把握新能源汽车的测试发展趋势,顺应历史的洪流。 学习目标:1.掌握HIL开发测试流程中的IO配置、开环验证、闭环模型开发及调试、自动化测试 2.掌握第三方模型的搭建及simulink关联仿真(2019.05.21新增:需巩固练习matlab基础——2...

masonson的专栏 4177

夜间灯光遥感数据介绍及下载汇总

夜间灯光遥感数据介绍及下载汇总

qq_43874102的博客 1万+

【React入门实践】复杂搜索表单的【展开-收起】功能

前端CSS面试题文档,JavaScript面试题文档,Vue面试题文档,大厂面试题文档aceholder=“总价范围” />)}})()}})(前端CSS面试题文档,JavaScript面试题文档,Vue面试题文档,大厂面试题文档[外链图片转存中…(img-r233Vysn-1718464562112)][外链图片转存中…(img-zzmWLLxB-1718464562113)]{reset}{search}{reset}{search}{reset}

2401_85124851的博客 808

COMSOL多物理场仿真:瓷绝缘子电热耦合建模与优化策略

本文详细介绍了使用COMSOL Multiphysics进行瓷绝缘子电热耦合仿真的完整流程与优化策略。文章阐述了电热耦合效应的工程意义,并逐步讲解了从几何建模、材料定义、物理场设置到边界条件与网格划分的关键步骤。重点分析了如何通过焦耳热耦合实现电场与温度场的双向交互,以及如何利用仿真结果进行参数化优化和瞬态故障模拟,为提升电力设备可靠性提供有效的数字化设计工具。

n8m7b6v5c4的博客 882

Vue3中搜索表单的二次封装

经过前两步的封装之后,在使用的SearchForm组件时,简直是爽的不要不要的。{label: '项目名称', prop: 'name', type: 'input'},{label: '项目编码', prop: 'code', type: 'input'},{label: '项目描述', prop: 'desc', type: 'select', list: [{label: '未开始', value: 1}, {label: '已开始', value: 2}]},

专注前端技术,包括Web端、移动端、小程序、APP 2359

DBC中如何实现报文传输类型属性的配置

AUTOSAR中CAN报文的传输类型主要有三种,周期型,事件型和混合型。周期型:按固定时间间隔自动发送,无需额外的触发条件。事件型:当信号值变化或满足内部条件时立即发送。混合型:默认按周期发送,但事件触发时可提前发送。

sunchengl的博客 303

【STK】手把手教你利用STK进行覆盖分析02-生成详细分析报告和图表

这篇文章主要针对上一篇文章中最后的案例1进行进一步的说明,详细介绍我们可以生成哪些结论性的成果。STK的Coverage模块的生成结果包括分析报告和图表两种样式,每种样式还分为动态和静态两种,也就是说,我们做完一个STK覆盖场景的仿真后,一般可以生成静态分析报告、动态分析报告、静态分析图表和动态分析图表这4种形式的分析成果,下面进行详细介绍。我们在选择了想要分析的区域或者点后,就可以利用CovDef生成分析报告了,覆盖定义的分析报告分为静态报告和动态报告两种,下面分析进行介绍: 首先我们先在左侧目标浏览器C

weixin_44184852的博客 3441

Vue3 数据列表增删改

复制下来,粘贴在小黑窗。

m0_63359528的博客 680

SAP ATP可用性检查简介

系统中建立此单时,SAP就会做一个所谓的检查,检查一下我们预先设定的考虑因素,能否满足客户的要求,什么时候可以满足,这就是可用性检查的功能。2、同样的在创建生产订单的时候也有ATP的检查,生产订单是100PC,要求2024-07-01生产完成,系统就会根据配置进行物料的可用性的检查,看物料是否能够满足生产同时能够满足交期。14: 表示相关预留的选项,与10的区别在于,10是一般是表示我们用MB21建立的,而14是表示由于相关预留,即此预留是来自于其他物料,如生产订单所产生的预留。

我小时候很黑的博客 3374

【亲测免费】 **探索Vue.js日志新境界 - vuejs-logger**

探索Vue.js日志新境界 - vuejs-logger 在现代Web开发中,日志记录是不可或缺的调试和监控工具,特别是在Vue.js应用开发领域。今天,我们为您隆重推荐一款专为Vue.js量身打造的日志解决方案——vuejs-logger。这款开源项目通过其高度定制化的特性,不仅简化了开发者在日常开发与维护中的日志管理,更是在提高生产环境效率的同时,保障了开发阶段的信息透明度。 项目介绍 vue...

gitblog_00053的博客 983

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

vue调试工具_11种顶级VueJS开发人员工具,会成为你的神兵利器吗?

全文共3283字,预计学习时长10分钟图源:Unsplash这次,小芯为大家安排上了11种顶级VueJS开发人员工具。Vue JS最近越来越流行,这主要是因为它为人们学习和开发应用程序提供了便利。无论是想要使用Vue的经验丰富的开发人员还是新手,使用正确的工具都很有必要。这将有助于快速创建出色的应用程序,而不必做重复工作。在为本文列表选取工具时,小芯考虑了整个Vue JS开发周期。从为新应用程序设...

weixin_39978749的博客 992

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Vue3 中 Proxy 在组件封装中的妙用

本文探讨了Vue3中利用Proxy实现组件优雅交互的方法。通过Proxy的get、has、ownKeys拦截器,可以轻松透传内部组件的方法和属性,解决组件封装中的交互痛点。以DialogTable组件为例,展示了如何让父组件直接访问内部ProTable的方法,无需手动转发或暴露引用。此外还介绍了Proxy在权限控制、调用日志和默认值处理中的应用场景,并指出需要注意组件生命周期和性能考量。这种方案能显著简化接口、减少样板代码,提升组件可维护性和灵活性。

前端kk的博客 1275

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

vue3开发实践总结

这个项目也算是完整的从0到1开发一个vue3项目,虽然项目不算大,但麻雀虽小五脏俱全,该有的体验也都把玩了一下。 总体来说,vue3带来了一些新内容,但还是属于框架内的改动,无法影响到整个前端圈。如果是之前平稳运行的项目,不建议推倒重构 到vue3版本,新项目或者小项目重构,可以大胆使用vue3 vue3是vue的未来,现在也已经很成熟了,后续的新项目,都推荐使用vue3来做的...

loulanyijian的专栏 1507

Vue3不习惯的点及setup免引入便捷操作

Vue3中setup免引入(组件+属性) elementplus按需自动引入 icon自动引入的配置以及部分语法与vue2不同的点

swoly2894265391的博客 918

【Vuejs】1613- 一起玩转Vue中的 JSX

JSX简介JSX是一种Javascript的语法扩展,即具备了Javascript的全部功能,同时又兼具html的语义化和直观性。它可以让我们在JS中写模板语法:constel=<div>Vue2</div>; 复制代码上面这段代码既不是 HTML 也不是字符串,被称之为 JSX,是 JavaScript 的扩展语法。JSX 可能会使人联想到模板语法,但是它具备 J...

pingan8787 316

关于vue—cli创建vue3项目引入element plus 按需引入方式的记录

虽然说工作中一直使用的vue2 但是在空闲之余也学习学习vue3,在断断续续的学习中,打算用element框架,但是在按需引入的时候频频报错,如果不按需引入全局引入的话又导致项目体积过大,后在查阅相关资料之后顺利的解决,再次做以记录。 废话不多说直接记录 1、根据element plus 官网指引下载相关依赖 由于我用的是vue cli 不是vite所以我直接用的内部包管理器,不用内部管理器的也可以用npm 等方式引入 npm install -D unplu...

weixin_48386494的博客 922

2020年,11种应该加入工具箱的顶级VueJS开发员工具​

全文共3283字,预计学习时长10分钟 图源:Unsplash 这次,小芯为大家安排上了11种顶级VueJS开发人员工具。 Vue JS最近越来越流行,这主要是因为它为人们学习和开发应用程序提供了便利。无论是想要使用Vue的经验丰富的开发人员还是新手,使用正确的工具都很有必要。这将有助于快速创建出色的应用程序,而不必做重复工作。 在为本文列表选取工具时,小芯考虑了...

读芯术的博客 1800

前端Vue篇之Vue 3.0 中的 Vue Composition API?Composition API与React Hook很像,区别是什么

Vue 3.0 中的 Composition API 和 React Hooks 都是用于在函数式组件中管理状态和逻辑的工具,它们有相似之处,但也有一些区别。

星辰迷上大海的博客 2441

vue调试工具_2020年,11种应该加入工具箱的顶级VueJS开发员工具?

全文共3283字,预计学习时长10分钟图源:Unsplash这次,小芯为大家安排上了11种顶级VueJS开发人员工具。Vue JS最近越来越流行,这主要是因为它为人们学习和开发应用程序提供了便利。无论是想要使用Vue的经验丰富的开发人员还是新手,使用正确的工具都很有必要。这将有助于快速创建出色的应用程序,而不必做重复工作。在为本文列表选取工具时,小芯考虑了整个Vue JS开发周期。从为新应用程序设...

weixin_39542043的博客 194

vue3项目创建方式记录

vite是下一代前端开发与构建工具。Vite意在提供开箱即用的配置,同时它的插件API和JavaScript API 带来了高度的可扩展性,并有完整的类型支持。这种方式相比第二张创建方式,集成了更多依赖和工具,比如Pinia和Router,让我们开发更加便捷。

to_prototy的博客 692

html怎么连接api vue.js_2020年,11种应该加入工具箱的顶级VueJS开发员工具?

全文共3283字,预计学习时长10分钟图源:Unsplash这次,小芯为大家安排上了11种顶级VueJS开发人员工具。Vue JS最近越来越流行,这主要是因为它为人们学习和开发应用程序提供了便利。无论是想要使用Vue的经验丰富的开发人员还是新手,使用正确的工具都很有必要。这将有助于快速创建出色的应用程序,而不必做重复工作。在为本文列表选取工具时,小芯考虑了整个Vue JS开发周期。从为新应用程序设...

weixin_42679995的博客 115

Webpack从0到1搭建Vue3项目

webpack从0到1初始化Vue项目

量子前端的博客 2825
上一篇: 微信小程序踩坑记录
下一篇: 微信小程序原生组件使用
FF_XM
博客等级 码龄5年 19粉丝 44原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值