# outline **Repository Path**: gzh52107/outline ## Basic Information - **Project Name**: outline - **Description**: h52107课件 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 6 - **Forks**: 0 - **Created**: 2021-10-18 - **Last Updated**: 2024-11-23 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 第三阶段 ## day2-1 ### 面试题 * v-show与v-if的区别 > 实际开发中使用v-show还是v-if * v-show: 有频繁的切换需求使用v-show * v-if: 如一开始就确定一个元素的显示或隐藏,后期没有频繁的操作,则使用v-if ### 知识点 * 前端三大热门框架 * Angular * React * Vue * 工具库 * jquery $ * lodash _ * underscore _ * 版本 * 按环境分 * 开发版本 development * 提示 * 未压缩 * 生产版本 production * 压缩 * Vue的使用 * 特点 * 渐进式框架 * 声明式设计 * 架构分层 * MVC * Model: 模型 > 数据 * View: 视图 > html页面 * Controller: 控制器 > 控制如何把数据渲染到视图层 * MVP * Model * View * Presenter 优化后的Controller * MVVM * M: Model * V: View * VM: ViewModel * 数据驱动 * 关注点变化 * 以前:节点操 * 现在:只关注数据的变化(要修改页面内容,不需要直接操作节点,只需要在合适的时间修改数据就行) * 响应式属性 > 可以监听到数据的修改,进而更新视图 * 原理:存储器属性(getter&setter) * `Object.defineProperty(target,prop,descriptor)` * target * prop * descriptor 属性描述对象 * configurable 总开关,用于控制enumerable属性是否可被修改 * enumerable 可枚举 * get * set * 双向数据绑定的原理 * Model -> View: getter & setter * View -> Model: 事件监听 * 页面渲染 * 数据绑定 * 单向绑定 * 绑定到标签内容 * {{}} 插值 * v-text * v-html > 使用v-html是一定要确保html内容的安全性,避免xss攻击 * 绑定到标签属性:v-bind * 双向绑定 * v-model 一般用于表单元素 > `v-model="msg" = v-bind:value="msg" + v-on:input="msg=$event.target.value"` * 事件绑定:v-on > 格式:v-on:事件="事件处理函数" * Vue指令 > 在指令中使用js语法 * v-model: 双向数据绑定 * View -> Model * Model -> View * 列表渲染:v-for > 通过遍历生成一个列表 * v-for=" in " * v-for=" of " * v-bind > 可以用在任意属性,并对class和style属性进行了增强(支持数组与对象写法) * v-show: 用于控制显示/隐藏 > 通过改变css的display属性实现显示隐藏 * v-if/v-else/v-else-if > 通过创建和销毁节点的方式实现显示隐藏 * v-text * v-html ## day2-2 ### 复习 * Vue * 声明式设计 * 渐进式框架 * 架构分层 * MVC * MVP * MVVM * M: Model * V: View * VM: ViewModel * 数据绑定 > 把数据与视图进行绑定 * 单向绑定 * {{}} * v-text * v-html * v-bind * 双向绑定 * v-model = v-bind:value + v-on:input * 响应式属性 > 属性的修改,会被监听到,进而刷新视图 * 原理:getter&setter * Object.defineProperty(target,prop,descriptor) * 指令 > 自定义的html属性 * v-model * v-bind * v-text * v-html * v-on * v-for * v-show * v-if/v-else/v-else-if ### 知识点 * 锻炼以下几种能力 * 整理知识点的能力 * 查看文档的能力 * 技术文档 * 需求文档 * 描述问题的能力 * 查找和解决问题的能力 * ref > this.$refs.xxx获取ref引用 * 事件绑定 * event事件对象 * 事件修饰符 > 格式:v-on:keyup.修饰符="事件处理函数" * 鼠标修饰符 * 按键修饰符 * v-model修饰符 * 简写:v-on:click -> @click * 数组的响应式 > Vue给数组重写原型对象,并添加一些变更方法实现响应式 * pop() * push() * shift() * unshift() * splice() * sort() * reverse() * computed 计算属性 > 具有**缓存特性**,只有在初始化和依赖发生变化时才重新执行里面的代码,一般用于优化代码 * 原理:getter&setter * computed vs methods > 优先使用computed * computed vs watch > 优先使用computed * watch 监听实例属性 > 可监听实例属性或子属性 ```js new Vue({ data:{ a:10, b:{ c:20 } } watch:{ a:function(n,o){}, 'b.c':function(n,o){} } }) ``` * 使用Vue总结 ```js // 类(构造函数):Vue // 实例:vm // 原型对象:Vue.prototype // 配置选项:options const vm = new Vue(options) ``` * 选项 * el * data * computed * watch * methods * 全局Api > Vue的静态属性/方法(全局属性/方法) ```js Vue.xxx Vue.xxx() ``` * vm实例属性/方法 * $开头:内置属性 * _开头:私有属性 * 自定义属性 > 一般来源于配置选项 ### 练习 * todolist的批量删除与批量完成 * 实现商品列表排序升序与降序的效果 ## day2-3 ### 面试题题 * 事件是如何传播的 * 捕获阶段 ```js btn.addEventListener('click',function(){},true) ``` * 冒泡阶段 * event对象中target与currentTarget的区别 * target: 触发事件的节点 * currentTarget: 绑定事件的元素 ### 复习 * 配置选项 * data * watch * computed * 缓存特性 * methods * Vue实例:vm * $refs * Vue类(构造函数) * 数组的响应式 * 如何设置响应式属性 > 当数据发生改变时会自动更新视图 * data属性设置初始值 * `Vue.set(target,key,val)` / vm.$set() * target: 可以是数组或对象,但不能是vm实例或$data根数据对象 ### 知识点 * 指令:一种特殊html标签属性 * 组件:一种特殊的html标签,定义一个组件,就相当于创建了一个标签 * 优点 * 复用 * 维护 * 分工 * 组件定义 > 定义组件的名称不能与内置的html标签一致,一个组件就是一个Vue的实例(意味着组件拥有与Vue实例化是一样的配置选项) * 全局组件:`Vue.component(name,options)` * 局部组件:`components:{name:options}` ```js Vue.component('mylist',{ data(){ return {} }, template:``, // render(){} }) ``` * 组件使用 ```html ``` * 拆分组件 > 把一个大的应用拆分成若干个独立的组件 * 数据放置问题 * 状态提升:如果是多个组件公用的数据,则放到它们共同的父级 * 数据修改方法放置问题 > 谁的数据谁修改 * 组件通讯 * 父->子: props > TodoList -> TodoContent -> TodoItem > -> TodoStatus 1. 父组件操作:给子组件定义属性,并传递父组件数据 2. 子组件操作:通过props选项接收父组件数据,props中的数据会自动写入组件实例(成为组件实例的属性意味着可以直接在模板中使用) * 子->父: * 方式一:把父组件方法传到子组件执行,并回传数据 * 方式二:**自定义事件**(推荐) 1. 父组件操作:给子组件自定义事件(如:v-on:show),并使用父组件的方法做为事件处理函数(handle) 2. 子组件操作:通过实例方法`$emit()`触发自定义事件并传递数据 * 方式三:v-bind的sync修饰符 * 深层级组件通讯 * 逐层传递(繁琐,不推荐) * Bus事件总线 > 用一个Vue实例作为事件载体配合事件实现数据共享 * 绑定事件: $on() * 触发事件: $emit() * 单向数据流 > 遵循谁的数据谁修改的原则,不要在子组件修改父组件传入的数据 * 特点: * 父组件修改数据会自动传入子组件,反之,子组件无法修改父组件传入的数据 * 需求:在子组件修改父组件的数据 * sync修饰符 ```html ``` * 渲染优先级 * el * template * render > 优先级:render > template > el ### 练习 * 完成课堂案例 * 实现全选效果 ## day2-4 ### 面试题 * jQuery链式调用的原理 > 每一个方法内都返回一个jQuery实例(this) ```js $('button') -> 实例 .addClass('btn') -> return 实例 .attr('type','submit') -> return 实例 .css({color:'#58bc58'}) .... ``` * 改变this指向的方式 * fn.call(target) * fn.apply(target) * fn.bind(target) * 共同点 * 都是函数的方法 * 都能改变函数的this指向 * 不同点 * call,apply改变函数this指向的同时并执行函数 * bind只改变函数this指向,并不执行函数,返回一个新的函数 * apply只能接受两个参数,第二个参数为数组,call,bind能接收任意数量参数 ```js fn.bind() ``` * 前端往后端传参的方式 > RESTful规范 * 请求类型 * get 查 * post 增 * put/path 改 * delete 删 * 传递方式 * url参数: ?name=value&name=value * 请求体:request body * 请求头:request header ```js const xhr = new XMLHttpRequest() //xhr.open('get',url,true) xhr.open('post',url,true) // 请求头 xhr.setRequestHeader('content-type','application/json') xhr.setRequestHeader('token','xxxx') // x-www-form-urlencoded // xhr.send('name=value&name=value'); // json xhr.send('{"username":"laoxie","password":"123456"}') $.ajax({ url, data:{} }) // express const app = express() // app.use('/goods',function(){}) app.get('/goods',function(){}) app.post('/goods',function(){}) app.put('/goods',function(){}) app.delete('/goods',function(){}) ``` * 接口链接:https://easydoc.net/s/58934052 密码:4wSFKBYp ### 复习 * 组件 * 优点 * 定义 * 全局:Vue.component() * 局部: components:{} * 要求 * 只能一个根节点 * data必须为函数 * 命名注意事项 * 渲染配置 * el * template ```js
hahah
-> createElement( 'div', { on:{ click:handle, keyup:handle } }, 'haha' ) ``` * render ```js render(createElement){ return createElement() } ``` * 组件通讯 > 组件通过某种规则组合起来形成一个组件树(拥有**组件层级**) * 父->子:props * 子->父: 自定义事件(v-on,$on(),$emit()) * 兄弟->兄弟 * 状态提升 * 深层及组件 * 逐层传递 * Bus事件总线 * 组件层级 * $parent * $children * $root * 单向数据流 > 父组件修改数据会自动影响子组件,反之不行(不能在子组件中修改props数据) * 特殊需求 * 父组件修改子组件数据 * $children * ref ```js this.$children[0].todo = '' ``` * 子组件修改父组件数据 * 自定义事件 ```js this.$emit('自定义事件',数据) ``` * v-bind:index.sync ```js this.$emit('update:index',2) ``` * this.$parent ```js // 子组件代码 this.$parent.datalist = [] ``` ### 知识点 * Vue-CLI(Vue Command Line Interface) > @vue/cli * 安装 ```bash npm install -g @vue/cli ``` * 创建vue项目 ```bash vue create ``` * eslint规则 * package.json * vue.config.js * 配置文件:vue.config.js * lintOnSave: 'warning' * 模块化开发规范 * commonJS: nodeJS * 引入:require() * 导出: module.exports * ESModule: ES6 > 把一个文件当作一个模块,模块具有独立作用域,要在外部获取模块内的变量,必须导入(前提是模块有导出) * 引入:import > import xxx from url * js文件 * 导出:export * 基本特点 * 每一个模块只加载一次, 并执行一次,再次加载同一文件,直接从内存中读取; * 每一个模块内声明的变量都是局部变量, 不会污染全局作用域; * 通过export导出模块,通过import导入模块 * ES6模块只支持静态导入和导出,只可以在模块的最外层作用域使用import和export , * 导入的url不能是变量 * url只能是相对路径或绝对路径 * AMD: require.js * CMD: sea.js * vue单文件组件 * template * script * style * npm * npm script * 运行: * `npm run ` * npm 镜像 ```bash # 查看镜像 npm config get registry # 修改镜像 npm config set registry https://registry.npm.taobao.org ``` * props数据类型校验 * 支持单个类型 ```js props:{ data:Array } ``` * 支持多个类型 ```js props:{ index:[Number,String] } ``` * 必写参数:required * 非props属性 > 子组件不通过props接收,这种属性会自动成为组件根元素的html属性 ## day2-5 ### 面试题 * 伪数组如何使用数组的方法 * 转成数组再调用 * Array.from() * [...] * call/apply ```js Array.prototype.map.call( document.querySelector('button'), function(item,idx,arr){ // item: 每一个button } ) ``` ### 复习 * 模块化 * commonJS * ES Module * AMD * CMD * ESModule * 导入: import * import name from url * import {name} from url * import {name as myname} from url * import * as all from url * 导出: export > export后只能跟随var,let,const,function,class,default,{} * 使用 * webpack VueCLI > webpack对esmodule进行增强(编译,构建) * 引入js文件 * 引入一个目录 * 引入vue单文件组件 * 引入css * 引入图片 * .... * html ```js ``` * props类型校验 * 非props:attrs > 非props会自动写入组件的根节点 * setAttribute()/点语法 ```js // ``` * 具名插槽 ```html ``` * 作用域插槽 ```html ``` * 插槽默认值 ```html // 默认结构
``` * 生命周期 * 搞懂以下问题 * 执行过程 * 在每个阶段能做什么 * 阶段 * 创建阶段:Create * beforeCreate() * created() * 挂载阶段:Mount * beforeMount() * mounted() * 卸载阶段:Destroy/UnMount * 更新阶段:Update ### 知识点 * 多页面应用Multiple Page Application(MPA) * 单页面应用Single Page Application(SPA) * 单页面多视图 * 路由 * 安装: ```bash npm install vue-router ``` * 使用步骤 1. 引入 ```js import VueRouter from 'vue-router' ``` 2. 安装插件 > 注册了两个全局组件``,`` ```js Vue.use(VueRouter) ``` 3. 实例化路由并配置参数 ```js const router = new Router({ routes:[{ // 当浏览器地址为/home时,显示Home组件的内容 path:'/home', component:Home },{ path:'/login', component:Login }] }) ``` 4. 把router实例注入到vue实例中 ```js new Vue({ ... router:router, }) ``` 5. 使用 * 显示路由:`` > ``为动态组件,根据不同的条件渲染不同的内容 * 条件:浏览器地址是否匹配path * 路由跳转 * 声明式导航:利用``组件跳转 * 编程式导航:利用js实现路由跳转 > 第4步的注入操作会给每个组件添加$router,$route属性 * $router: 路由实例 * push() 等效于`` * replace() 等效于`` * go() * back() * forward() * $route: 当前路由信息对象 * 跳转传参 * query传参 > 接收:this.$route.query ```js this.$router.push('/login?username=laoxie') this.$router.push({ path:'/login', query:{ username:'laoxie' } }) ``` * params传参 > 接收:`this.$route.params` * 注意:只能在name方式跳转时使用params传参, * 缺点:刷新后数据丢失(动态路由例外) * 数据持久化 * query * 动态路由 * Vue UI框架(组件库) * elementUI 饿了么 * ant-design 蚂蚁金服 * iView 腾讯 * VantUI 有赞 ## day3-2 ### 复习 * VueRouter > 在单页面应用中实现多视图的功能 * 使用步骤 1. 引入 2. 安装插件:Vue.use() * * 3. 实例化路由并配置参数 * routes * path * component 4. 注册Vue根实例 * $router * $route 5. 使用 * 显示路由组件: * 跳转(路由导航) * 声明式导航: * to * replace * 编程式导航 * $router.push() * $router.replace() * $router.back() * $router.forward() * $router.go() * 路由跳转 * 跳转方式 * path ```js $router.push('/home') $router.push({path:'/home'}) ``` * name ```js $router.push({name:'Home}) ``` * 传参 * query > 数据持久化 * params * 动态路由 ### 知识点 * 定义路由时传参 * props ```js props:['a','b'] new VueRouter({ routes:[ { path:'/home', component:Home, // props:{}, // props:function(){}, props:true } ] }) ``` * axios * axios(config) / axios(url,config) * axios.get(url,config) * axios.post(url,data,config) * axios.put(url,data,config) * axios.patch(url,data,config) * axios.delete(url,config) * config * url 请求地址 * method 请求类型 * params url传参 * data 请求体传参 * headers 请求头传参 * 二次封装 ```js $.ajax({ url }) $.ajax(url,{}) $.get() $.post() ``` * sass * 安装依赖 * sass-loader@10.2.0 * sass * lang="scss" * lang="sass" * 组件局部样式:` ``` *