Olá ~ Hoje escrevi uma página vue3 usando ts, que precisa ser detalhada. Para facilitar a manutenção do código, encapsulei-o levemente;
Deixe-me falar sobre o método de escrita dos subcomponentes primeiro, escreva um formulário normalmente e adicione condições de pesquisa~
<template>
<el-drawer v-model="drawer" size="80%" direction="btt" title="数据列表">
<el-form :inline="true" :model="formInline" class="demo-form-inline">
<el-form-item label="区县">
<el-input v-model="formInline.regionName" placeholder="请输入区县" />
</el-form-item>
<el-form-item label="公司名称">
<el-input v-model="formInline.companyName" placeholder="请输入公司名称" />
</el-form-item>
<el-form-item>
<el-button type="primary" @click="onSubmit">查询</el-button>
<el-button type="primary" @click="resetting">重置</el-button>
</el-form-item>
</el-form>
<el-table :data="tableData" style="width: 100%">
<el-table-column prop="regionName" label="区县名称" />
<el-table-column prop="companyName" label="公司名称" />
</el-table>
</el-drawer>
</template>
<script lang="ts" setup>
import { ref, reactive } from "vue";//引入
const props = defineProps({
tableData: Array,//子接收数据
});
const drawer = ref(false);//定义窗户出现
const formInline = reactive({//定义搜索表单,
regionName: "",
heatstationName: ""
});
const open = () => {//子组件打开的方法
drawer.value = true;
};
//父组件要想调用子组件的方法,必须得先让子组件把方法推出去
defineExpose({
open
});
const emit = defineEmits(["clickToFather"]);
const onSubmit = () => {//子组件搜索,调用父组件的方法,要用emit,一定在上面调用哦
emit("SubmitSearch", formInline);
};
</script>
<style></style>
A parte ts do componente filho inclui defineProps para recebimento, e o método chamado deve ser lançado para defineExpose ({method}), e o filho altera o componente pai (o filho chama o pai) com const emit = defineEmits(["clickToFather "]) Definição, uso
emit("SubmitSearch", formInline) chama e passa valores.
<script lang="ts" setup>
import { ref, reactive } from "vue";//引入
const props = defineProps({
tableData: Array,//子接收数据
});
const drawer = ref(false);//定义窗户出现
const formInline = reactive({//定义搜索表单,
regionName: "",
heatstationName: ""
});
const open = () => {//子组件打开的方法
drawer.value = true;
};
//父组件要想调用子组件的方法,必须得先让子组件把方法推出去
defineExpose({
open
});
const emit = defineEmits(["clickToFather"]);
const onSubmit = () => {//子组件搜索,调用父组件的方法,要用emit,一定在上面调用哦
emit("SubmitSearch", formInline);
};
</script>
Agora é o componente pai ~
import RunDrawering from "./components/RunDrawer.vue";//引入不需要注册,直接使用。
Use diretamente
<RunDrawering ref="rundrawers" :tableData="tableData" @SubmitSearch="SubmitSearch" />
Como o subcomponente é uma camada pop-up, eu clico diretamente no botão para chamar o método do subcomponente, então dê uma ref ao subcomponente
const rundrawers = ref<any>();//定义子组件的ref,不定义会出错
const RunDrawer = () => {
rundrawers.value.open();//调用子组件的方法
baseService.get("接口", { page: 1, limit: 100 }).then((res) => {
tableData.value = res.data.list;//这里调取了接口传值
});
};
O pai recebe a chamada de método do componente filho e os parâmetros são passados assim
const SubmitSearch = (formInline: Object) => {
baseService.get("接口", { page: 1, limit: 100, regionName: formInline.regionName, companyName: formInline.companyName }).then((res) => {
tableData.value = res.data.list;
});
};
Estou recebendo um erro aqui,
O identificador 'RunDrawer' já foi declarado.
Pesquisei porque a definição do nome do meu componente foi repetida, todos devem prestar atenção ~