--- title: Vue.js 挑战练习 created: 2022-08-12 summary: 我的答案以及相关知识点 tags: - Vue --- 最近做了一下这个[Vue.js 挑战](https://cn-vuejs-challenges.netlify.app/questions/14-dynamic-css-values/README.zh-CN.html),其中的题目大多出自[Vue3 文档](https://staging-cn.vuejs.org/),都不是很难,但涉及到的知识点 比较琐碎,用来复习挺好的。 然后这是我的答案和题目涉及到的知识点,除了[鼠标指针](/2022-08-12-vue-challenges###鼠标指针)这个部分没通过单元测试之外,其他都都通过了,然后这个鼠标指针为什么没通过单元测试我也没弄明白,试了下其他人的也通过不了,好奇怪…… 这里省去部分题目,主要写答案。 ## Built-ins ### DOM 传送门 Vue.js 提供了一个内置组件,将其插槽内容渲染到另一个 DOM,成为该 DOM 的一部分。 ```vue ``` 相关知识点 :[Teleport | Vue.js](https://v3.cn.vuejs.org/guide/teleport.html#teleport) > 有时组件模板的一部分逻辑上属于该组件,而从技术角度来看,最好将模板的这一部分移动到 DOM 中 Vue app 之外的其他位置[^1]。 - 有点像传送门,将相应元素渲染到制定位置 - to 后面写 css selector ### 优化性能的指令 Vue.js 提供了一个指令,以便只渲染一次元素和组件,并且跳过以后的更新。 ```vue ``` 相关知识点:`Vue-事件修饰符` ## CSS Features ### 动态 CSS Vue 单文件组件 ` ``` 相关知识点:`v-bind` `Dynamic Styling动态绑定样式` ### 全局 CSS 给具有 CSS 作用域的 Vue 单文件组件设置全局 CSS 样式 ```vue ``` 或者 ```vue ``` 相关知识点:[单文件组件 CSS 功能 | Vue.js](https://staging-cn.vuejs.org/api/sfc-css-features.html) ## Components ### DOM 传送门 见上面 ### Props 验证 验证 Button 组件的 Prop 类型 ,使它只接收: primary | ghost | dashed | link | text | default ,且默认值为 default ```vue ``` 相关知识点:[Props | Vue.js](https://staging-cn.vuejs.org/guide/components/props.html#prop-validation) ### 函数式组件 这题我不是很懂,翻了一下大家的解决方案,感觉这个比较能看懂:[21 - functional component · Issue #322 · webfansplz/vuejs-challenges · GitHub](https://github.com/webfansplz/vuejs-challenges/issues/322) ```vue ``` 相关知识点: - [渲染函数 & JSX | Vue.js](https://staging-cn.vuejs.org/guide/extras/render-function.html#functional-components) - [渲染机制 | Vue.js](https://staging-cn.vuejs.org/guide/extras/rendering-mechanism.html) ### 渲染函数[h()] > 使用 h 渲染函数来实现一个组件。 ```js import { defineComponent, h } from 'vue' export default defineComponent({ name: 'MyButton', props: { disabled: { type: Boolean, default: false } }, emits: ['custom-click'], setup(props, { emit, slots }) { return () => h( 'button', { disabled: props.disabled, onClick: () => emit('custom-click') }, slots.default?.() ) } }) ``` ### 树组件 实现一个树组件 ```vue ``` 参考: - [208 - Tree Component · Issue #659 · webfansplz/vuejs-challenges · GitHub](https://github.com/webfansplz/vuejs-challenges/issues/659) - [Creating a Recursive Tree Component in Vue.js | DigitalOcean](https://www.digitalocean.com/community/tutorials/vuejs-recursive-components) 相关知识点:[单文件组件 ` ``` ### 计数器 实现一个计数器 ```vue ``` ### 实现本地存储函数 封装一个`localStorage`API ```vue ``` 相关知识点: - [watchEffect()](https://staging-cn.vuejs.org/api/reactivity-core.html#watcheffect) - [Window.localStorage - Web API 接口参考 | MDN](https://developer.mozilla.org/zh-CN/docs/Web/API/Window/localStorage) ### 鼠标坐标 这个没通过单元测试,不知道什么原因,试了下其他人的也没能通过…… ```vue ``` ## Composition API ### 生命周期钩子 ```vue ``` - 相关知识点: - [组合式 API:依赖注入 | Vue.js](https://staging-cn.vuejs.org/api/composition-api-dependency-injection.html) - [组合式 API:生命周期钩子 | Vue.js](https://staging-cn.vuejs.org/api/composition-api-lifecycle.html#onunmounted) ### ref 全家桶 ```vue ``` 相关知识点: - [isRef()](https://staging-cn.vuejs.org/api/reactivity-utilities.html#isref) - [unref()](https://staging-cn.vuejs.org/api/reactivity-utilities.html#unref) - [toRef](https://staging-cn.vuejs.org/api/reactivity-utilities.html#toref) ### 响应性丢失 保证解构/扩展不丢失响应性 ```vue ``` 相关知识点:[toRefs](https://staging-cn.vuejs.org/api/reactivity-utilities.html#torefs) ### 可写的计算属性 ```vue ``` 相关知识点:[可写的计算属性 ](https://staging-cn.vuejs.org/guide/essentials/computed.html#writable-computed) ### watch 全家桶 ```vue ``` 相关知识点:[侦听器 | Vue.js](https://staging-cn.vuejs.org/guide/essentials/watchers.html) ### 浅层 ref 响应式 API: shallowRef ```vue ``` 相关知识点:[shallowRef()](https://staging-cn.vuejs.org/api/reactivity-advanced.html#shallowref) ### 依赖注入 child.vue ```vue ``` 相关知识点:[组合式 API:依赖注入 | Vue.js](https://staging-cn.vuejs.org/api/composition-api-dependency-injection.html) ### Effect 作用域 API ```vue ``` 相关知识点:[effectScope](https://staging-cn.vuejs.org/api/reactivity-advanced.html#effectscope) ### 自定义 ref ```vue ``` 相关知识点:[customRef](https://staging-cn.vuejs.org/api/reactivity-advanced.html#customref) ## Directives ### 大写 创建一个自定义的修饰符  `capitalize`,它会自动将  `v-model`  绑定输入的字符串值首字母转为大写: App.vue ```vue ``` Input.vue ```vue ``` 相关知识点:[处理 v-model 修饰符](https://staging-cn.vuejs.org/guide/components/events.html#usage-with-v-model) ### 优化性能的指令 见上面。v-once ### 切换焦点指令 ```vue ``` 相关知识点:[自定义指令 | Vue.js](https://staging-cn.vuejs.org/guide/reusability/custom-directives.html) ### 防抖点击指令 尝试实现一个防抖点击指令 ```vue ``` 相关知识点:[指令钩子](https://staging-cn.vuejs.org/guide/reusability/custom-directives.html#introduce) ### 激活的样式-指令 ```vue ``` ### 实现简易版`v-model`指令 ```vue ``` ## Event Handling ### 阻止事件冒泡 ```vue ``` 相关知识点:[事件修饰符](https://staging-cn.vuejs.org/guide/essentials/event-handling.html#event-modifiers) ### 按键修饰符 ```vue ``` 相关知识点:[按键修饰符](https://staging-cn.vuejs.org/guide/essentials/event-handling.html#key-modifiers) ## Global API:General ### 下一次 DOM 更新 在`Vue.js`中改变响应式状态时,DOM 不会同步更新。 `Vue.js`  提供了一个用于等待下一次 DOM 更新的方法 ```vue ``` 相关知识点:[nextTick()](https://staging-cn.vuejs.org/api/general.html#nexttick) ## Lifecycle ### 生命周期钩子 [同上:生命周期钩子](#生命周期钩子) ## Reactivity:Advanced ### 浅层 ref [同上:浅层 ref](#浅层-ref) ### 原始值 API ```vue ``` 相关知识点: - [toRaw](https://staging-cn.vuejs.org/api/reactivity-advanced.html#toraw) - [markRaw](https://staging-cn.vuejs.org/api/reactivity-advanced.html#markraw) ### Effect 作用域 API [同上:Effect 作用域 API](#effect-作用域-api) ### 自定义 ref [同上:自定义 ref](#自定义-ref) ## Reactivity:Core ### ref 全家桶 [同上:ref 全家桶](#ref-全家桶) ### 可写的计算属性 [同上:可写的计算属性](#可写的计算属性) ### watch 全家桶 [同上:watch 全家桶](#watch-全家桶) ## Reactivity:Utilities ### 响应性丟失 [同上:响应性丟失](#响应性丟失) ## Utility Function ### until ```vue ``` ## Web Components ### 自定义元素 ```vue ``` 并且 vite.config.js 里要做相关设置 相关知识点:[Vue 与 Web Components | Vue.js](https://staging-cn.vuejs.org/guide/extras/web-components.html)