# 常用筆記
### 兒子發送事件給父親
``` js=
const emit = defineEmits<{
(e: 'update:modelValue', value: any): void;
(e: 'onSelectEnd', select: number[]): void;
}>();
const onChange = (value: number[]) => {
emit('onSelectEnd', value);
emit('update:modelValue', value);
};
```
### 封裝組件雙向綁定v-model
#### 兒子
``` vue=
<template>
<div >
<input type="text" v-model="inputData">
</div>
</template>
<script>
export default {
model:{
prop:"value", // 定義v-model接收到的變數名
event:"eventChange" // 定義v-model修改新值的事件名
},
props:{
value:{
type:String,
value:""
}
},
data() {
return {
inputData:this.value,
}
},
watch: {
inputData(newValue) {
this.$emit("eventChange",newValue);
}
},
}
</script>
```
#### 父親
``` html=
<my-input v-model="bindData"></my-input>
```
### 具名slot用法
兒子
``` html=
<slot name="footer">Default Footer</slot>
```
父親
``` html=
<ChildComponent>
<template v-slot:header>
</template>
</ChildComponent>
```
### sync用法
父子組件溝通時,兒子可利用emit向父親發送事件數據
有時候父子共用同一個參數,並且名稱一樣,
兒子則可以利用sync來做到父子同步
#### 首先兒子需要emit去向父親溝通
``` javascript
this.$emit('update:openModal',false);
```
#### 父親則需要以下寫法去接收
``` html
<LoginModal
:openModal="openModal"
@update:openModal="val => openModal= val"
></LoginModal>
```
#### 但是這樣寫法其實很冗長,父親寫法可以直接改成
``` html
<LoginModal
:openModal.sync="openModal"
></LoginModal>
```
#### 限制input只能輸入整數
oninput ="value=value.replace(/[^\d]/g,'')" //只能输入数字
oninput ="value=value.replace(/[^0-9.]/g,'')" //只能输入数字和小数
``` html=
<el-input v-model="sjje" oninput ="value=value.replace(/[^0-9.]/g,'')" class="money sjje">
<span slot="suffix">/ 元 </span>
</el-input>
```
#### el-checkbox阻止冒泡事件
```html=
<el-checkbox
@click.native='stopDefault($event)'>
</el-checkbox>
// js
stopDefault (e) {
e.stopPropagation()
}
```
### el-input 阻擋冒泡事件
<el-input
@click.stop.native=""
@keyup.enter.native.stop=""
>
</el-input>
### vue 綁定style處理hover寫法
``` html=
<div class="test"
:style="optionBlockItemLabelHover">
登出
</div>
```
``` js=
optionBlockItemLabelHover() {
return { '--activeColor': '#fff' };
},
```
``` class=
.test {
&:hover {
color: var(--activeColor);
}
}
```