Vue3使用

news2024/9/29 3:23:48

1、列表实现

<el-table :data="tableData" border style="width: 100%" @selection-change="handleSelectionChange" :header-cell-style="{'text-align':'center'}">
      <el-table-column type="selection" width="55" align="center" />
      <el-table-column prop="date" label="日期" align="center">
      </el-table-column>
      <el-table-column prop="name" label="姓名" align="left">
      </el-table-column>
      <el-table-column prop="age" label="年龄" align="right">
      </el-table-column>
      <el-table-column prop="sex" label="性别" align="left" :formatter="sexFormat">
      </el-table-column>
      <el-table-column prop="phone" label="电话" align="left">
      </el-table-column>
      <el-table-column prop="address" label="地址" :show-overflow-tooltip="true" align="left">
      </el-table-column>
      <el-table-column prop="enableFlag" label="启用状态" :formatter="enableFlagFormat" align="left">
      </el-table-column>
      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="200">
        <template #default="scope">
          <el-button size="mini" type="text" @click="handleSelect(scope.$index,scope.row)">详情</el-button>
          <el-button size="mini" type="text" @click="handleUpdate(scope.$index,scope.row)">修改</el-button>
        </template>
      </el-table-column>
    </el-table>

vue3 中无法使用slot-scope的问题

vue2:上下对应,title是自己随便起的名字

1、定义一个普通的插槽,可以用div,任何标签

<div slot="title"></div>

2、定义一个element列表里面插槽的标签

<div slot="title" slot-scope="scope"></div>

vue3:上下对应,title是自己随便起的名字

1、注意,vue3中只能用template, # 等同于 slot=

<template #title></template>

2、注意,vue3中只能用template, # 等同于 slot=

<template #title="scope"></template>

 2、el-dialog实现

<el-dialog v-model="addOpen" class="diaStyle" style="height: 80vh; overflow-y: auto" :title="title">
      <el-form ref="ruleForm" :model="form" :inline="true" :rules="rules" label-width="80px" style="margin-bottom: 20px">
        <el-row>
          <el-col :span="12">
            <el-form-item label="日期" prop="date" style="width: 100%;">
              <el-input v-model="form.date" type="text" placeholder="请输入日期" :disabled="disabled" />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="姓名" prop="name" style="width: 100%;">
              <el-input v-model="form.name" type="text" placeholder="请输入姓名" :disabled="disabled" />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="12">
            <el-form-item label="性别" prop="sex" style="width: 100%;">
              <el-select v-model="form.sex" placeholder="请选择性别" :disabled="disabled">
                <el-option v-for="item in sexOption" :key="item.value" :label="item.label" :value="item.value">
                </el-option>
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="年龄" prop="age" style="width: 100%;">
              <el-input v-model="form.age" type="text" placeholder="请输入年龄" :disabled="disabled" />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="12">
            <el-form-item label="联系方式" prop="phone" style="width: 100%;">
              <el-input v-model="form.phone" type="text" placeholder="请输入联系方式" :disabled="disabled" />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="启用状态" prop="enableFlag" style="width: 100%;">
              <el-radio-group v-model="form.enableFlag" :disabled="disabled">
                <el-radio v-for="dict in enableOption" :key="dict.value" :label="dict.value">{{dict.label}}</el-radio>
              </el-radio-group>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="24">
            <el-form-item label="地址" prop="address" style="width: 100%;">
              <el-input v-model="form.address" type="text" placeholder="请输入地址" :disabled="disabled" />
            </el-form-item>
          </el-col>
        </el-row>

      </el-form>
      <div class="dialog-footer">
        <el-button type="primary" @click="submitForm" v-preventReClick="2000" v-if="confDisabled">保 存</el-button>
        <el-button @click="closeDialog">{{buttonName}}</el-button>
      </div>
    </el-dialog>

2.1、vue3 中无法使用:visible.sync的问题

:visible指的是属性绑定,表示弹框的显示隐藏。当:visible的值为ture的时候,弹框显示,当为false的时候,弹框隐藏。:visible.sync指的就是同步动态双向的来表示visible的值。

在vue3中取而代之的是v-model,将:visible.sync  改为  v-model

2.2、submitForm提交校验form表单

<script setup>
import { toRefs, ref, reactive, unref} from 'vue'
/** 提交按钮 */
  let submitForm = () => {
    const ff = unref(ruleForm);
    if (!ff) return;
    ruleForm.value.validate((valid) => {
      if (valid) {
        if (form.value.id != undefined) {
          instance.proxy.$message({
            message: 'id为:' + form.value.id + '的数据修改成功',
            type: 'success',
          })
          addOpen.value = false;
          reset();
        } else {
          instance.proxy.$message({
            message: '新增成功',
            type: 'success',
          })
          addOpen.value = false;
          reset();
        }
      }
    });
</script>

3、分页实现

<el-pagination class="v3-page" @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="currentPage4"
      :page-sizes="[5,10, 20, 30, 40]" :page-size="5" layout="total, sizes, prev, pager, next, jumper" :total="total">
    </el-pagination>
<script setup>
import { toRefs, ref, reactive} from 'vue'
const handleSizeChange = (val) => {
    console.log(`每页 ${val} 条`);
    pageSize.value = val
    getListData();
  }

  const handleCurrentChange = () => {
    console.log(`当前页: ${val}`);
    page.value = val
    getListData();
  }
</script>

vue3 Element-UI 插件 Pagination 显示为英文问题

在mains.js 里添加

import ElementPlus from 'element-plus'
import zhCn from 'element-plus/dist/locale/zh-cn.mjs'
// en是英文 zh-cn 是中文
app.use(ElementPlus, {
  locale: zhCn,
})

4、$message提示消息

<script setup>
  import { getCurrentInstance } from 'vue'
  import { getTenantDatas } from '@/api/v3'
  //使用message
  const instance = getCurrentInstance()
  const { proxy } = getCurrentInstance();
      instance.proxy.$message({
        message: `操作成功`,
        type: 'success',
      })
</script>

5、监听

5.1普通监听

<script setup>
import { toRefs, ref, reactive, watch} from 'vue'
const count = ref(0)
watch(count, (newValue, oldValue) => {
    if (newValue) {
      instance.proxy.$message({
        message: `我侦听到了count状态的变化,当前值为${newValue},从而处理相关逻辑`,
        type: 'success',
      })
    }
  })
</script>

5.2深度监听

<script setup>
import { toRefs, ref, reactive, watch} from 'vue'
  const user = reactive({
    name: 'zs',
    age: 18,
  })
  //深度监听
  watch(
    user,
    (value) => {
      console.log(value)
      instance.proxy.$message({
        message: `我侦听到了user年龄的变化,当前值为${value.age},从而处理相关逻辑`,
        type: 'success',
      })
    },
    {
      // 深度监听,,,当ref的值是一个复杂数据类型,需要深度监听
      deep: true,
      immediate: true
    }
  )
</script>

6、onMounted钩子函数

<script setup>
import { toRefs, ref, reactive, onMounted} from 'vue'
  //注册周期钩子:钩子可以用来在组件完成初始渲染并创建 DOM 节点后运行代码
  onMounted(() => {
    instance.proxy.$message({
      message: "生命周期函数:onMounted",
      type: 'success',
    })
  })
</script>

7、reactive 和 ref区别

1、reactive 和 ref 是 Vue 3 中的两种响应式数据绑定方式,ref 适用于简单的响应式数据,而 reactive 则适用于复杂对象或数组的响应式数据。

2、ref:使用 .value 属性来访问和修改值。

3、reactive:可以直接访问和修改对象或数组的属性或元素,而无需使用 .value。

8、父子组件相互调用

1、父组件

<template>

  <div id="example1" class="demo">
<child ref="childRef" :parentData="state" :parentFunction="myFunction" style="margin-top: 20px;" />
  </div>
</template>
<script setup>
  import { toRefs, ref, reactive, watch, unref, computed, onMounted } from 'vue'
  import child from './views/child.vue'
  import { getCurrentInstance } from 'vue'

  const state = reactive({
    patientInfo: null,
    ActiveIndex: 0,
    myData: '我是父组件里的属性',
    name: '孩子',
    age: '15',
    sex: '男',
  })
const myFunction = (item) => {
    instance.proxy.$message({
      message: '我是父组件里的方法',
      type: 'success',
    })
  }
  //调用子组件中的方法
  const childRef = ref(null);
  let handleChild = () => {
    childRef.value.changeData();
  }


2、子组件

<template>

    <div id="example1" class="demo" style="border: 1px solid blue">
        <el-form :model="dataForm" label-width="80px" style="margin-bottom: 20px">
            <el-row>
                <el-col :span="12">
                    <el-form-item label="解释" prop="myData" style="width: 100%;">
                        <el-input v-model="dataForm.myData" type="text" placeholder="请输入解释" />
                    </el-form-item>
                </el-col>
                <el-col :span="12">
                    <el-form-item label="姓名" prop="name" style="width: 100%;">
                        <el-input v-model="dataForm.name" type="text" placeholder="请输入姓名" />
                    </el-form-item>
                </el-col>
            </el-row>
            <el-row>
                <el-col :span="12">
                    <el-form-item label="性别" prop="sex" style="width: 100%;">
                        <el-input v-model="dataForm.sex" type="text" placeholder="请输入性别" />
                    </el-form-item>
                </el-col>
                <el-col :span="12">
                    <el-form-item label="年龄" prop="age" style="width: 100%;">
                        <el-input v-model="dataForm.age" type="text" placeholder="请输入年龄" />
                    </el-form-item>
                </el-col>
            </el-row>

        </el-form>
        <el-button size="mini" type="primary" @click="handleClick()">触发</el-button>
    </div>
</template>

<script setup>
    import { toRefs, ref, reactive, watch, unref, defineExpose, computed } from 'vue'
    import { getCurrentInstance } from 'vue'
    //使用message
    const instance = getCurrentInstance()
    const { proxy } = getCurrentInstance();
    const props = defineProps({
        parentData: {
            type: Object,
            default: () => {
                return {}
            }
        },
        parentFunction: {
            type: Function,
            default: () => null,
        },
    })
    //计算属性computed函数
    const dataForm = computed(() => props.parentData);
    let handleClick = () => {
        //父组件中的方法
        props.parentFunction(dataForm);
    }
    //子组件定义方法供父组件调用
    const changeData = () => {
        instance.proxy.$message({
            message: '我是子组件里的方法',
            type: 'success',
        })
    }
    defineExpose({
        changeData,
    });

</script>

<style>
    #app {
        font-family: Avenir, Helvetica, Arial, sans-serif;
        -webkit-font-smoothing: antialiased;
        -moz-osx-font-smoothing: grayscale;
        text-align: center;
        color: #2c3e50;
        margin-top: 60px;
    }
</style>

3、效果

9、完整demo代码

 9.1、app.vue

<template>

  <div id="example1" class="demo">
    <el-row :gutter="10" style="margin-bottom: 10px">

      <el-col :span="1.5">
        <el-button type="primary" size="mini" @click="handleInsert">
          新增
        </el-button>
      </el-col>
      <el-col :span="1.5">
        <el-button type="primary" size="mini" @click="handleChild">
          子组件调用
        </el-button>
      </el-col>
    </el-row>
    <el-table :data="tableData" border style="width: 100%" @selection-change="handleSelectionChange" :header-cell-style="{'text-align':'center'}">
      <el-table-column type="selection" width="55" align="center" />
      <el-table-column prop="date" label="日期" align="center">
      </el-table-column>
      <el-table-column prop="name" label="姓名" align="left">
      </el-table-column>
      <el-table-column prop="age" label="年龄" align="right">
      </el-table-column>
      <el-table-column prop="sex" label="性别" align="left" :formatter="sexFormat">
      </el-table-column>
      <el-table-column prop="phone" label="电话" align="left">
      </el-table-column>
      <el-table-column prop="address" label="地址" :show-overflow-tooltip="true" align="left">
      </el-table-column>
      <el-table-column prop="enableFlag" label="启用状态" :formatter="enableFlagFormat" align="left">
      </el-table-column>
      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="200">
        <template #default="scope">
          <el-button size="mini" type="text" @click="handleSelect(scope.$index,scope.row)">详情</el-button>
          <el-button size="mini" type="text" @click="handleUpdate(scope.$index,scope.row)">修改</el-button>
        </template>
      </el-table-column>
    </el-table>
    <el-pagination class="v3-page" @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="currentPage4"
      :page-sizes="[5,10, 20, 30, 40]" :page-size="5" layout="total, sizes, prev, pager, next, jumper" :total="total">
    </el-pagination>

    <!-- 添加修改对话框 -->
    <!--给el-dialog添加一个mpc-model-middle的class-->
    <el-dialog v-model="addOpen" class="diaStyle" style="" :title="title">
      <el-form ref="ruleForm" :model="form" :inline="true" :rules="rules" label-width="80px" style="margin-bottom: 20px">
        <el-row>
          <el-col :span="12">
            <el-form-item label="日期" prop="date" style="width: 100%;">
              <el-input v-model="form.date" type="text" placeholder="请输入日期" :disabled="disabled" />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="姓名" prop="name" style="width: 100%;">
              <el-input v-model="form.name" type="text" placeholder="请输入姓名" :disabled="disabled" />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="12">
            <el-form-item label="性别" prop="sex" style="width: 100%;">
              <el-select v-model="form.sex" placeholder="请选择性别" :disabled="disabled">
                <el-option v-for="item in sexOption" :key="item.value" :label="item.label" :value="item.value">
                </el-option>
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="年龄" prop="age" style="width: 100%;">
              <el-input v-model="form.age" type="text" placeholder="请输入年龄" :disabled="disabled" />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="12">
            <el-form-item label="联系方式" prop="phone" style="width: 100%;">
              <el-input v-model="form.phone" type="text" placeholder="请输入联系方式" :disabled="disabled" />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="启用状态" prop="enableFlag" style="width: 100%;">
              <el-radio-group v-model="form.enableFlag" :disabled="disabled">
                <el-radio v-for="dict in enableOption" :key="dict.value" :label="dict.value">{{dict.label}}</el-radio>
              </el-radio-group>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="24">
            <el-form-item label="地址" prop="address" style="width: 100%;">
              <el-input v-model="form.address" type="text" placeholder="请输入地址" :disabled="disabled" />
            </el-form-item>
          </el-col>
        </el-row>

      </el-form>
      <div class="dialog-footer">
        <el-button type="primary" @click="submitForm" v-preventReClick="2000" v-if="confDisabled">保 存</el-button>
        <el-button @click="closeDialog">{{buttonName}}</el-button>
      </div>
    </el-dialog>
    <child ref="childRef" :parentData="state" :parentFunction="myFunction" style="margin-top: 20px;" />
    <div style="border: 2px solid #f708bb;height: 80px;text-align: center;margin-top: 10px">
      <el-button size="mini" type="primary" @click="changCount" style="margin-top: 5px;display: flex;justify-content: flex-start;margin-left: 5px;">更改count的值</el-button>
      <div>{{ count }}</div>
      <div>姓名:{{ user.name }},年龄:{{user.age}}岁</div>
    </div>
    <div style="border: 2px solid #008000;height: 160px;text-align: center;margin-top: 10px">暂时没想出来写点啥</div>
  </div>
</template>

<script setup>
  import { toRefs, ref, reactive, watch, unref, computed, onMounted } from 'vue'
  import child from './views/child.vue'
  import { getCurrentInstance } from 'vue'
  import { getTenantDatas } from '@/api/v3'
  //使用message
  const instance = getCurrentInstance()
  const { proxy } = getCurrentInstance();
  const data = reactive({

  })
  const count = ref(0)
  const user = reactive({
    name: 'zs',
    age: 18,
  })
  function changCount() {
    count.value++
    user.age++
  }
  watch(count, (newValue, oldValue) => {
    if (newValue) {
      instance.proxy.$message({
        message: `我侦听到了count状态的变化,当前值为${newValue},从而处理相关逻辑`,
        type: 'success',
      })
    }
  })
  //深度监听
  watch(
    user,
    (value) => {
      console.log(value)
      instance.proxy.$message({
        message: `我侦听到了user年龄的变化,当前值为${value.age},从而处理相关逻辑`,
        type: 'success',
      })
    },
    {
      // 深度监听,,,当ref的值是一个复杂数据类型,需要深度监听
      deep: true,
      immediate: true
    }
  )
  //注册周期钩子:钩子可以用来在组件完成初始渲染并创建 DOM 节点后运行代码
  onMounted(() => {
    instance.proxy.$message({
      message: "生命周期函数:onMounted",
      type: 'success',
    })
  })
  const state = reactive({
    patientInfo: null,
    ActiveIndex: 0,
    myData: '我是父组件里的属性',
    name: '孩子',
    age: '15',
    sex: '男',
  })
  //reactive 和 ref 是 Vue 3 中的两种响应式数据绑定方式,ref 适用于简单的响应式数据,而 reactive 则适用于复杂对象或数组的响应式数据。
  //ref:使用 .value 属性来访问和修改值。
  //reactive:可以直接访问和修改对象或数组的属性或元素,而无需使用 .value。
  let tableData = reactive([])
  // 数据相关 ?sortProperty=createdTime&sortOrder=DESC&pageSize=10&page=0
  const total = ref(0)
  const sortProperty = ref('createdTime')
  const sortOrder = ref('DESC')
  const pageSize = ref(2)
  const page = ref(1)
  // 获取数据的方法
  const getListData = async () => {
    instance.proxy.$message({
      message: "获取数据的方法",
      type: 'success',
    })
    const result = await getTenantDatas({
      sortProperty: sortProperty.value,
      sortOrder: sortOrder.value,
      pageSize: pageSize.value,
      page: page.value - 1
    })
    tableData = result
    total.value = result.length
  }
  const handleSizeChange = (val) => {
    console.log(`每页 ${val} 条`);
    pageSize.value = val
    getListData();
  }

  const handleCurrentChange = () => {
    console.log(`当前页: ${val}`);
    page.value = val
    getListData();
  }

  // 执行方法
  getListData()
  //表单校验
  let rules = ref({
    date: [
      { required: true, message: "日期不能为空", trigger: "blur" },
    ],
    name: [
      { required: true, message: "名称不能为空", trigger: "blur" },
    ],
    address: [
      { required: true, message: "地址不能为空", trigger: "blur" },
    ],
    enableFlag: [
      { required: true, message: "启用状态不能为空", trigger: "blur" },
    ],
    age: [
      { required: true, message: "启用状态不能为空", trigger: "blur" },
    ],
    sex: [
      { required: true, message: "启用状态不能为空", trigger: "blur" },
    ],
  });
  // 详情
  let form = ref({
  });
  const ruleForm = ref(null); //表单
  let addOpen = ref(false);
  let disabled = ref(false);
  let buttonName = ref("取 消");
  let confDisabled = ref(false);
  let title = ref("");
  let handleSelect = (index, row) => {
    form.value = row;
    disabled.value = true;
    addOpen.value = true;
    confDisabled.value = false;
    buttonName.value = "关 闭";
    title.value = "查看详情"
  }
  //修改
  let handleUpdate = (index, row) => {
    form.value = row;
    disabled.value = false;
    addOpen.value = true;
    confDisabled.value = true;
    buttonName.value = "取 消";
    title.value = "修改信息"
  }
  //新增
  let handleInsert = () => {
    disabled.value = false;
    addOpen.value = true;
    confDisabled.value = true;
    buttonName.value = "取 消";
    title.value = "新增信息"
  }
  /** 提交按钮 */
  let submitForm = () => {
    const ff = unref(ruleForm);
    if (!ff) return;
    ruleForm.value.validate((valid) => {
      if (valid) {
        if (form.value.id != undefined) {
          instance.proxy.$message({
            message: 'id为:' + form.value.id + '的数据修改成功',
            type: 'success',
          })
          addOpen.value = false;
          reset();
        } else {
          instance.proxy.$message({
            message: '新增成功',
            type: 'success',
          })
          addOpen.value = false;
          reset();
        }
      }
    });
  };
  //关闭弹窗
  let closeDialog = () => {
    addOpen.value = false;
    reset();
  }

  let reset = () => {
    form.value = {}
  }

  let ids = ref(undefined);
  let banchParams = ref([]);
  //多选框选中数据
  let handleSelectionChange = (selection) => {
    ids.value = selection.map(item => item.id)
    banchParams.value = selection
    console.log(ids.value)
  }
  let enableOption = [
    {
      "label": "启用",
      "value": "0"
    }, {
      "label": "停用",
      "value": "1"
    }
  ];
  let enableFlagFormat = (item) => {
    return format(enableOption, item.enableFlag);
  };
  // 回显
  let format = (datas, value) => {
    var actions = [];
    Object.keys(datas).some((key) => {
      if (datas[key].value == ('' + value)) {
        actions.push(datas[key].label);
        return true;
      }
    })
    return actions.join('');
  }
  let sexOption = [
    {
      "label": "男",
      "value": "0"
    }, {
      "label": "女",
      "value": "1"
    }, {
      "label": "未知",
      "value": "2"
    }
  ];
  let sexFormat = (item) => {
    return format(sexOption, item.sex);
  };

  const myFunction = (item) => {
    instance.proxy.$message({
      message: '我是父组件里的方法',
      type: 'success',
    })
  }
  //调用子组件中的方法
  const childRef = ref(null);
  let handleChild = () => {
    childRef.value.changeData();
  }
</script>

<style>
  #app {
    font-family: Avenir, Helvetica, Arial, sans-serif;
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
    text-align: center;
    color: #2c3e50;
    margin-top: 60px;
  }

  .demo {
    border: 2px solid #ff0000;
    padding: 20px;
  }

  .v3-page {
    margin-top: 5px;
    display: flex;
    justify-content: flex-end;
  }
  .dialog-footer{
    display: flex;
    justify-content: flex-end;
  }
</style>

9.2、child.vue

<template>

    <div id="example1" class="demo" style="border: 1px solid blue">
        <el-button size="mini" type="primary" @click="handleClick()" style="margin-bottom: 10px;display: flex;justify-content: flex-start;margin-left: -15px;">触发父组件方法</el-button>
        <el-form :model="dataForm" label-width="80px">
            <el-row>
                <el-col :span="12">
                    <el-form-item label="解释" prop="myData" style="width: 100%;">
                        <el-input v-model="dataForm.myData" type="text" placeholder="请输入解释" />
                    </el-form-item>
                </el-col>
                <el-col :span="12">
                    <el-form-item label="姓名" prop="name" style="width: 100%;">
                        <el-input v-model="dataForm.name" type="text" placeholder="请输入姓名" />
                    </el-form-item>
                </el-col>
            </el-row>
            <el-row>
                <el-col :span="12">
                    <el-form-item label="性别" prop="sex" style="width: 100%;">
                        <el-input v-model="dataForm.sex" type="text" placeholder="请输入性别" />
                    </el-form-item>
                </el-col>
                <el-col :span="12">
                    <el-form-item label="年龄" prop="age" style="width: 100%;">
                        <el-input v-model="dataForm.age" type="text" placeholder="请输入年龄" />
                    </el-form-item>
                </el-col>
            </el-row>

        </el-form>
    </div>
</template>

<script setup>
    import { toRefs, ref, reactive, watch, unref, defineExpose, computed } from 'vue'
    import { getCurrentInstance } from 'vue'
    //使用message
    const instance = getCurrentInstance()
    const { proxy } = getCurrentInstance();
    const props = defineProps({
        parentData: {
            type: Object,
            default: () => {
                return {}
            }
        },
        parentFunction: {
            type: Function,
            default: () => null,
        },
    })
    //计算属性computed函数
    const dataForm = computed(() => props.parentData);
    let handleClick = () => {
        //父组件中的方法
        props.parentFunction(dataForm);
    }
    //子组件定义方法供父组件调用
    const changeData = () => {
        instance.proxy.$message({
            message: '我是子组件里的方法',
            type: 'success',
        })
    }
    defineExpose({
        changeData,
    });

</script>

<style>
    #app {
        font-family: Avenir, Helvetica, Arial, sans-serif;
        -webkit-font-smoothing: antialiased;
        -moz-osx-font-smoothing: grayscale;
        text-align: center;
        color: #2c3e50;
        margin-top: 60px;
    }
</style>

package.json中设置rules

"rules": {
      "no-undef": "off",
      "no-unused-vars": "off",
      "vue/multi-word-component-names": "off"
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1396278.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JAVA——数据类型与运算符

数据类型 注意事项&#xff1a;1.初始化操作是可选的, 但是建议创建变量的时候都显式初始化. 2.最后不要忘记分号, 否则会编译失败. 3.初始化设定的值为 10L , 表示一个长整型的数字. 10l 也可以. 4.float 类型在 Java 中占四个字节, 遵守 IEEE 754 标准. 由于表示的数据精度范…

广东金牌电缆:法大大电子合同助力业务风险管控

广东金牌电缆集团股份有限公司&#xff08;以下简称“广东金牌电缆”&#xff09;成立于2013年&#xff0c;现为广东省电线电缆重点生产企业、广东省守合同重信用单位、国家专精特新小巨人企业、国家高新技术企业&#xff0c;拥有自主商标“夺冠”&#xff0c;“夺冠”商标被评…

P4学习(五)实验二:Basic Tunneling

目录 一. 实验目的二. 实验过程1. Topo2. Parse3.Ingress 三. 实验结果1. 测试dst_addr 10.0.2.2的正常包2.测试走隧道的正常包3.发给h3但是带上隧道标签的包4.测试总结 四. 拓展1.table-entries里的匹配规则2.myTunnel_header.py 一. 实验目的 In this exercise, we will add…

“一键中日文件夹名转换 - 批量修改,轻松实现中文到日语的名称翻译“

在处理大量文件夹时&#xff0c;你是否曾为中日文件夹名称的转换而感到困扰&#xff1f;现在&#xff0c;有了我们的批量修改工具&#xff0c;这些烦恼全部消失&#xff01;只需简单几步&#xff0c;就能将中文名的文件夹名称翻译成日语&#xff0c;让你的文件管理更加高效。 …

最新企业数据实时同步软件推荐

实时同步软件能够帮助企业快速、准确地共享和更新数据&#xff0c;提高工作效率和决策质量。本文将介绍企业数据实时同步的概念、意义和应用场景&#xff0c;并推荐几款非常优秀的企业数据实时同步软件。 一、数据实时同步的意义 企业数据实时同步是指在企业内部或跨部门之间&…

13 STM32-随机数发生器 (RNG)

13.1 随机数发生器 (RNG)简介 RNG 处理器是一个以连续模拟噪声为基础的随机数发生器&#xff0c;在主机读数时提供一个 32 位的随机数. RNG 提供由模拟量发生器产生的 32 位随机数,两个连续随机数的间隔为 40 个 PLL48CLK 时钟信号周期 13.2 RNG框图 随机数发生器采用模拟电路…

多目标优化(Python):多目标粒子群优化算法(MOPSO)求解ZDT1、ZDT2、ZDT3、ZDT4、ZDT6(提供Python代码)

一、多目标粒子群优化算法 多目标粒子群优化算法&#xff08;MOPSO&#xff09;是一种用于解决多目标优化问题的进化算法。它基于粒子群优化算法&#xff08;PSO&#xff09;&#xff0c;通过引入多个目标函数和非支配排序来处理多目标问题。 MOPSO的基本思想是将问题转化为在…

React配置src根目录@

文章目录 1.打开webpack配置文件2.配置webpack 1.打开webpack配置文件 yarn eject or npm run eject 如果报错了记得提前 git commit一下 2.配置webpack 找到 webpack.config.js 文件在 webpack.config.js 文件中找到 alias 配置在alias里添加: path.resolve(src) , 或者 : pa…

文本按照标点符号切分符号丢掉问题

问题&#xff1a;文本按照标点符号切分符号丢掉问题 项目场景&#xff1a;需要对一个文字段落按照标点符号切分成一个个句子&#xff0c;使用正则切分的过程中发现标点符号丢了&#xff0c; 问题描述 文本按照标点符号切分符号丢掉问题 原始代码&#xff1a; public static v…

在分类任务中准确率(accuracy)、精确率(precision)、召回率(recall)和 F1 分数是常用的性能指标,如何在python中使用呢?

在机器学习和数据科学中&#xff0c;准确率&#xff08;accuracy&#xff09;、精确率&#xff08;precision&#xff09;、召回率&#xff08;recall&#xff09;和 F1 分数是常用的性能指标&#xff0c;用于评估分类模型的性能。 1. 准确率&#xff08;Accuracy&#xff09;…

ChatGPT Plus续费充值,到账延迟,如何申诉?

ChatGPT Plus充值总是到账延迟比较严重&#xff0c;一般多是通过充值链接代充值遇到&#xff0c;如果是账号登陆充值&#xff0c;是即时到账。但是有的客户不愿意提供账号密码&#xff0c;遇到延迟到账的情况如何解决呢&#xff1f;客户可按下面操作申诉&#xff0c;可快速到账…

大创项目推荐 深度学习花卉识别 - python 机器视觉 opencv

文章目录 0 前言1 项目背景2 花卉识别的基本原理3 算法实现3.1 预处理3.2 特征提取和选择3.3 分类器设计和决策3.4 卷积神经网络基本原理 4 算法实现4.1 花卉图像数据4.2 模块组成 5 项目执行结果6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &a…

Ansys Zemax | 如何使用光学制造全息图修正像差

附件下载 联系工作人员获取附件 本文介绍了利用光学全息图降低单透镜像差的方法。在描述了表示全息图构造光束的两个 ZMX 文件之后&#xff0c;本文演示了如何在重现文件中设置 OFH。然后解释了如何轻松地从重现文件中访问任何结构造光束变量&#xff0c;以实现衍射受限单透镜…

Git一台电脑 配置多个账号

Git一台电脑 配置多个账号 Git一台电脑 配置多个账号 常用的Git版本管理有 gitee github gitlab codeup &#xff0c;每个都有独立账号&#xff0c;经常需要在一个电脑上向多个代码仓提交后者更新代码&#xff0c;本文以ssh 方式为例配置 1 对应账号 公私钥生成 建议&#…

canvas绘制图形

目录 1、canvas绘制矩形 2、canvas绘制线 3、canvas绘制圆 4、canvas绘制多圈动画圆 HTML5<canvas>元素用于图形的绘制&#xff0c;Canvas API主要聚焦于2D图形。 1、canvas绘制矩形 canvas是一个二维网格&#xff0c;左上角坐标为(0,0)&#xff0c;横轴为x轴&…

【Git】实习使用记录

浏览器可以访问github仓库&#xff0c;但是使用git就用不了 https://blog.csdn.net/m0_63230155/article/details/132070860 可能是git http和https代理的问题 git config --global --unset http.proxy git config --global --unset https.proxy可能之前http和https之前是…

Python实现自动化办公(使用第三方库操作Excel)

1 使用 xlrd 读取Excel数据 1.1 获取具体单元格的数据 import xlrd# 1. 打开工作簿 workbook xlrd.open_workbook("D:/Python_study_projects/Python自动化办公/Excel/test1.xlsx") # 2. 打开工作表 sheet1 workbook.sheets()[0] # 选择所有工作表中的第一个 # …

mysql数据库:迁移数据目录至另一台服务器步骤

一、概述 最近由于项目需要&#xff0c;我们需要进行数据库服务器的更换和迁移工作。迁移计划和步骤如下&#xff1a; 1、首先&#xff0c;在新的数据库服务器上进行环境的搭建和配置&#xff0c;确保数据库版本、配置等一致。 2、然后&#xff0c;将备份的数据库数据导入到…

【docker-compose】【nginx】内网环境https配置

目录 1、openssl生成自签名证书和私钥2、nginx.conf配置ssl3、docker-compose挂载 1、openssl生成自签名证书和私钥 在部署服务器上&#xff0c;新建cert目录&#xff0c;执行以下指令&#xff0c;然后生成.crt和.key文件 openssl req -newkey rsa:2048 -nodes -keyout rsa_pri…

寒假刷题-递归与递推

寒假刷题 92. 递归实现指数型枚举 解法1递归 使用递归对每一个坑位进行选择&#xff0c;每个坑位有两种选择&#xff0c;填或者不填&#xff0c;使用st数组来记录每个坑位的状态&#xff0c;u来记录已经有多少坑位有了选择。 每个坑位有2钟选择&#xff0c;n个坑位的复杂度就…