vue3中,新增了 defineComponent ,它并没有实现任何的逻辑,只是把接收的 Object 直接返回,它的存在是完全让传入的整个对象获得对应的类型,它的存在就是完全为了服务 TypeScript 而存在的。
我都知道普通的组件就是一个普通的对象,既然是一个普通的对象,那自然就不会获得自动的提示,
import { defineComponent } from 'vue'
const component = {
name: 'Home',
props:{
data: String,
},
setup // 没有该有的提示,这非常的不友好
}
export default component
但是当我们加上 defineComponent() 之后,就完全不一样了,可以获得自动提示,vue2、vue3的自动提示都有
import { defineComponent } from 'vue'
const component = {
name: 'Home',
props:{
data: String,
},
setup () {
// setup 可接受两个参数,一个props,和 context
}
}
export default component
接下来看看 setup 中的两个参数 props 与 context ,
import { defineComponent } from 'vue'
const component = {
name: 'Home',
props:{
data: String,
},
setup(props, context){
// props.data
// context.attrs context.slots context.emit
}
}
export default component
vue3之组件结构(defineComponent,setup函数)
在vue3中,对组件整体结构做一些调整,先看一个组件案例:
import {ref, reactive, defineComponent, Ref, onMounted} from "vue";
import {settingsStore} from "/@/store/module/settings";
import {IRoleList} from "/@/interface/role/list.interface";
import {IHttpResult} from "/@/interface/common.interface";
import { ILogListParams } from "/@/interface/settings/log.interface";
export default defineComponent({
name: "LogList",
setup() {
const logList: Ref<IRoleList[]> = ref([]);
const columns = [
...
];
const pagination = ref({
"show-quick-jumper": true,
total: 100,
current: 1,
"show-size-changer": true,
"show-total": (total: number, range: number[]) => `${range[0]}-${range[1]} 共 ${total} 条`,
"pageSize": 10
});
const columnsList = ref(columns);
const params: ILogListParams = reactive({
page: 1,
pageSize: 10
});
onMounted(() => {
findLogList();
});
/*查询日志列表*/
const findLogList = () => {
settingsStore.findLogList(params).then((res: IHttpResult) => {
const data = res.data;
pagination.value.total = data.total;
logList.value = data.list;
});
};
/*修改状态*/
const onChange = (pagination: {current: number, pageSize: number}) => {
params.page = pagination.current;
params.pageSize = pagination.pageSize;
};
/*删除*/
const onDelete = (id: number) => {
alert(id);
};
return {
columnsList,
logList,
onDelete,
onChange,
pagination
};
}
});
从上面组件代码中,可以看出在vue3中没有this对象, 所有的逻辑代码都写在setup方法里面,若是要在HTML模板页面中使用变量或者方法, 需要在setup方法return出去.
setup是Vue3 的一大特性函数, 它有几个特性:
setup函数的注意点:
vue3虽然支持vue2.x版本的写法,但也有一些要注意的地方