使用TS写Vue项目
基础用法
export default class Base extends Vue {
// 变量
private name = "张三";
private a = 1;
private b = 2;
//计算属性
private get count(): number {
return Number(this.a) + Number(this.b);
}
// methods方法 不带返回值
public handleChangeName(): void {
this.name = "李四";
}
// methods方法 带返回值
public getName(): string {
return this.name;
}
// 生命周期
private created(): void {}// 创建已完成
private mounted(): void {} // 挂载已完成
private updated(): void {} // 更新已完成
private destroyed(): void {} // 组件已销毁
}
prop
父向子传递数据
//JS
export default {
props:{
str:{
type:String,
default:''
},
num:{
type:Number,
default:0
},
bl:{
type:Boolean,
default:false
}
}
}
//TS
export default class PageProp extends Vue {
//字符串
@Prop({ type: String, default: "" }) str!: string;
//数字
@Prop({ type: Number, default: 0 }) num!: number;
//布尔值
@Prop({ type: Boolean, default: false }) bl!: boolean;
}
propSync
子向父传递数据与父向子传递数据的简写
//子页面 PagePropSync.vue
//Template
<button @click="handleEditName">把张三改成李四</button>
//TS
export default class PagePropSync extends Vue {
//使用PropSync之后,父节点与子节点就建立了双向绑定,子节点变了父节点监听的变量也会相应的变,父节点变量变了子节点监听的变量也会相应的变化
//modelName 父节点绑定的属性 modelName:sync
//name 子与父需要通讯的变量
@PropSync("modelName", { type: String }) name!: string;
public handleEditName(): void {
this.name = "李四";
}
}
//父节点 PageHome.vue
//Template
<PagePropSync :modelName.sync="name" />
<p>子组件传过来的值:{{ name }}</p>
//TS
export default class Home extends Vue {
//PagePropSync
name = "张三";
}
model
父组件 modelVal 变化,子组件 val 也会跟着变化,val 变化modelVal不会变,总结父组件只能向子组件传递数据
//子组件 PageModel.vue
//Template
<p>Model的输入框 {{val}}</p>
//TS
export default class PageModel extends Vue {
@Model("modelVal") val!: string;
}
//父组件 PageHome.vue
//Template
<PageModel v-model="modelVal" />
//TS
export default class PageModel extends Vue {
//Model
modelVal = "父级传过来的默认值";
}
watch
数据监听
//JS
export default {
data() {
return {
msg: 'hello world!',
obj: {
a: 1
}
}
},
watch: {
msg() {
console.log("msg值被改变了");
},
obj: {
handle() {
console.log("obj被改变了");
},
deep: true
}
}
}
//TS
export default class PageWatch extends Vue {
private msg = "hello world!";
private obj = {
a: 1
};
// 普通监听
@Watch("msg")
onMsgChange() {
console.log("msg值被改变了");
}
// 深度监听
@Watch("obj", {
deep: true
})
onObjChange() {
console.log("obj被改变了");
}
}
provide inject
组件通讯,inject注入,provide接收
PageInject.vue
#inject 注入变量 //Template <button @click="handleInject">触发父组件App.vue的方法</button>
//TS export default class PageInjectReactive extends Vue { @Inject("reload") readonly reload!: Function; public handleInject() { this.reload({ obj: { a: 1 } }); } }
App.vue #provide 监听变化 //TS export default class App extends Vue { @Provide("reload") reload(val: object) { console.log(val); console.log("穿过router-view我被子组件调用了"); } }
emit
子组件向父组件通讯
//子组件 PageEmit.vue
//Template
<button @click="EmitParent">Emit</button>
//TS
export default class PageEmit extends Vue {
private msg = "我是PageEmit.vue文件的内容";
@Emit("EmitParent") //EmitParent 父组件事件名称
EmitParent() {
return this.msg;
}
}
//父组件 PageHome.vue
//Template
<PageEmit @EmitParent="receiveEemitChild" />
//TS
@Component({
components: {
PageEmit,
}
})
export default class Home extends Vue {
//接收PageEmit.vue 传过来的值
public receiveEemitChild(val: string): void {
console.log(val); //子组件传递过来的值
}
}
ref
获取dom节点
//Template
<div ref="offset">顶部的距离</div>
//TS
export default class PageRef extends Vue {
@Ref() readonly offset!:HTMLButtonElement;
mounted() {
this.$nextTick(() => {
console.log(this.offset);//返回 <div ref="offset">顶部的距离</div>
});
}
}
附上demo地址
https://gitee.com/qing_321/vue-ts.git
愿你走出半生,归来仍是少年

浙公网安备 33010602011771号