发布时间:2023-06-07 19:30
内容 | 参考链接 |
---|---|
JavaScript 面试高频考点 | HTML、CSS、JavaScript、ES6、AJAX、HTTP 面试考点 |
Vue2.x 面试高频考点 | Vue2.x 面试高频考点 |
Vue3.x新增API | 生命周期,ref、toRef 和 toRefs 的理解和最佳使用方式 |
Vue3.x升级的重要功能 | emits属性、生命周期、多事件、Fragment、移出.async、异步组件写法、移出 filter、Teleport、Suspense… |
Vue3.x响应式 | Composition API的逻辑复用、Proxy实现响应式 |
Vue3.x深入理解 | v-model参数用法、watch和watchEffect区别等 |
在一个包含 title prop 的组件中,我们可以用以下方法表达对其赋新值的意图
普通写法:
this.$emit('update:title', newTitle)
<text-document
v-bind:title="doc.title"
v-on:update:title="doc.title = $event"
>
</text-document>
.sync
修饰符(简写):
<text-document v-bind:title.sync="doc.title"></text-document>
若要更改 model 名称,而不是更改组件内的 model 选项,那么可以将一个 arguments 传递给 model
<ChildComponent v-model:title="pageTitle"></ChildComponent>
<!-- 是以下的简写 -->
<ChildComponent :title="pageTitle" @update:title="pageTitle = $event"></ChildComponent>
示例:
index.vue 父组件
<template>
<p>{{ name }} {{ age }}</p>
<UserInfo
v-model:name="name"
v-model:age="age"
>
</UserInfo>
</template>
<script>
import { reactive, toRefs } from 'vue'
import UserInfo from './UserInfo.vue';
export default {
name: 'VModel',
components: {UserInfo},
setup() {
const state = reactive({
name: '杂货铺',
age: '20'
})
return toRefs(state)
}
};
</script>
UserInfo.vue 子组件
<template>
<input :value="name" @input="$emit('update:name', $event.target.value)">
<input :value="age" @input="$emit('update:age', $event.target.value)">
</template>
<script>
export default {
name: 'UserInfo',
props: {
name: String,
age: String
}
};
</script>
(1)示例:watch 监听 值 的变化
<template>
<p>watch vs watchEffect</p>
<p>{{ numberRef }}</p>
</template>
<script>
import { ref, toRefs, watch} from 'vue'
export default {
name: 'Watch',
setup() {
// 定义值类型
const numberRef = ref(100)
// watch 监听
watch(numberRef, (newNumber, oldNumber) => {
console.log('ref watch', newNumber, oldNumber);
})
// 定时器,修改 numberRef 的值,用于监听
setTimeout(() => {
numberRef.value = 200
}, 1000)
return {
numberRef,
}
}
};
</script>
watch 监听可选的第三个参数
immediate: true // 初始化之前就监听,可选
(2)示例:watch 监听 对象 的变化
<template>
<p>watch vs watchEffect</p>
<p>{{ name }} {{ age }}</p>
</template>
<script>
import { reactive, toRefs, watch} from 'vue'
export default {
name: 'Watch',
setup() {
const state = reactive({
name: '杂货铺',
age: 21
})
watch(
// 第一个参数,确定要监听哪个属性
() => state.age,
// 第二个参数,回调函数
(newAge, oldAge) => {
console.log('state watch', newAge, oldAge);
},
// 第三个参数,配置项,可选
{
immediate: true, // 初始换之前就监听,可选
deep: true // 深度监听
}
)
setTimeout(() => {
state.age = 25
}, 3000)
setTimeout(() => {
state.name = '前端杂货铺'
}, 5000)
return {
...toRefs(state)
}
}
};
</script>
示例:watchEffect 监听对象变化
<template>
<p>watch vs watchEffect</p>
<p>{{ name }} {{ age }}</p>
</template>
<script>
import { reactive, toRefs, watchEffect} from 'vue'
export default {
name: 'Watch',
setup() {
const state = reactive({
name: '杂货铺',
age: 21
})
// 初始化时,一定会执行一次(收集要监听的数据)
watchEffect(() => {
console.log('hello watchEffect');
})
// 监听 state.name
watchEffect(() => {
console.log('state.name', state.name);
})
// 监听 state.age
watchEffect(() => {
console.log('state.age', state.age);
})
setTimeout(() => {
state.age = 25
}, 1500)
setTimeout(() => {
state.name = '前端杂货铺'
}, 3000)
return {
...toRefs(state)
}
}
};
</script>
示例:使用 getCurrentInstance 获取当前实例
<template>
<p>setup中获取组件实例</p>
</template>
<script>
import { getCurrentInstance, onMounted } from 'vue';
export default {
name: 'GetInstance',
data() {
return {
x: 1
}
},
setup() {
// Composition API 没有 this => undefined
console.log('this1', this);
// 获取当前实例
const instance = getCurrentInstance()
console.log('instance', instance);
// 挂载完成 => 通过 instance.data.x 获取 x 的值
onMounted(() => {
// 挂载完也没有 this => undefined
console.log('this in onMounted', this);
console.log('x', instance.data.x);
})
},
// vue2.x 中有 this,能直接取到值
mounted() {
console.log('this2', this);
console.log('x', this.x);
}
};
</script>
测试地址:PatchFlag测试
Vue2.x 与 Vue3.x diff 算法的部分区别:
出处:https://coding.imooc.com/lesson/419.html#mid=41996
Options 打开 hoistStatic:
需要什么就引入什么:
示例:ES Module 在浏览器中的使用
print.js 文件
export default function (a, b) {
console.log(a, b)
}
add.js 文件
import print from './print.js'
export default function add(a, b) {
print('print', 'add')
return a + b
}
test.html
type="module"
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ES Module demo</title>
</head>
<body>
<p>基本演示</p>
<script type="module">
import add from './src/add.js'
const res = add(1, 2)
console.log('add res', res)
</script>
</body>
</html>
不积跬步无以至千里 不积小流无以成江海
点个专注不迷路,持续更新中…
关于ORM实体映射的感想 (Object /Relational Mapper )
pytorch学习笔记(二)——加载数据Dataset以及Dataloader的使用
TensorFlow 1.0已死,TensorFlow 2.0万岁
苹果或推出多屏幕iPhone;爱彼迎CEO:办公室时代已过去;Apache Flink 1.15 发布|极客头条
调整pandas dataframe输出到excel的工作表worksheet顺序
5天学会mysql_5天学完《MySQL必知必会》学习笔记之第四天
Two-Stream Convolutional Networks for Action Recognition in Videos双流网络论文精读