热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【面筋烧烤手册】20210305

1.HTTP和HTTPS2.301和302,怎么判断500永久性重定向、临时性,都可以改post500原因:前端JSON格式错误
1.HTTP和HTTPS

在这里插入图片描述

2.301和302,怎么判断500
  • 永久性重定向、临时性,都可以改post
  • 500
  • 原因:前端JSON格式错误(比如有值没传),后端无判空,运行错误。
  • 捕获:

.catch(error => {console.log(error.response.data.error.message)
}

3.跨域

  • CORS 服务器
  • JSONP
  • 正向代理 反向代理

4.闭包
  • 函数嵌套
  • 自执行函数
  • 保存变量、保护变量
  • 防止污染
  • 垃圾回收、内存

在这里插入图片描述

5.垂直居中
  • flex
  • 绝对定位
    在这里插入图片描述

6.自适应
  • rem

7.node接触过吗

听说过koa2、pm2守护进程

8.mvvm

model view

9.vue单向数据流
9.vue组件参数传递方式

在这里插入图片描述

9.vue双向数据绑定和单项绑定

在这里插入图片描述

双向绑定实例

定义:

组件中变量(data中或props中)的值改变时,文本框的值也跟着改变,文本框的值改变(用户操作,比如输入,清空)时,组件中属性(data中或props中)的值 也同步变化

语法:

v-model
<input v-model&#61;"multiple" type&#61;"text" >
export default {
props: [&#39;packageData&#39;],data: () &#61;> ({originPrice: 300,multiple: 1})
}

以上是双向绑定,

一边是文本框的值,

一边是data属性multiple,

只要一边的值发生变化,另一边将同步改变

单项绑定实例

修改组件中变量(data中或props中)的值改变时,文本框的值也跟着改变

语法:

<input type&#61;"text" id&#61;"agentCode" v-bind:value&#61;"orgFullName" value&#61;"" >

当修改data中orgFullName的值时,文本框的值也跟着改变

可以简写:

:value&#61;"orgFullName"

<template><div class&#61;"clearfloat"><p class&#61;"Tstore-buleTitle fl" style&#61;"line-height:28px;">测试信息</p><div class&#61;"Tcode-box fl"><input type&#61;"text" id&#61;"testId" :value&#61;"orgFullName" value&#61;"" ></div><a class&#61;"Tcode-btn fl" &#64;click&#61;"queryAgent" >验证</a></div></template>
<script>import testService from &#39;&#64;/services/testService&#39;export default {data: () &#61;> ({orgFullName: &#39;&#39;}),methods: {queryAgent: function () {
// alert(111)this.orgFullName &#61; &#39;&#39;testService.queryAgent($(&#39;#testId&#39;).val()).then(testValue &#61;> {if (testValue && testValue.orgFullName) {this.orgFullName &#61; testValue.orgFullName}})}}}
</script>

使用 v-model 来进行数据双向绑定。要牢记&#xff1a;

<input v-model&#61;"something">

这不过是以下示例的语法糖&#xff1a;

<input
v-bind:value&#61;"something"
v-on:input&#61;"something &#61; $event.target.value">

10.vue的响应式和观察者模式

  • 在数据变化的时候&#xff0c;视图也会随着改变&#xff0c;这就是响应式
  • VUE使用Object.defineProperty 中getter和setter方法中的观察者模式来实现响应式

Object.defineProperty

次方法是对象方法&#xff0c;在一个对象上定义一些新的属性及方法&#xff0c;或改变对象的现有方法&#xff0c;并返回这个对象。
举个示例看一下&#xff1a;

var mVal &#61; 0;
var o &#61; {};
Object.defineProperty(o, &#39;m&#39;){get: function(){console.log(&#39;这里监听获取m值");return mVal;},set: function(newVal){console.log(&#39;这里监听修改m值");mVal &#61; newVal;},enumerable : true,configurable : true
}
o.m &#61; 88;
console.log(o.m); // 88

分析&#xff1a;当调用o.m给对象o中的m属性赋值的时候&#xff0c;会调用set方法&#xff0c;将m的值赋给mVal&#xff0c;此时就会调用get方法&#xff0c;获取这个值。
通过这种方式我们就可以实现一个简单的vue双向绑定了&#xff0c;给data中的所有属性加上get和set方法

观察者模式


  • 观察者模式分为注册环节与发布环节。
    将需要修改的属性集中注册一下&#xff0c;当处理完后一起发布出去。

function Observer(){this.dep &#61; [];register(fn){this.dep.push(fn)}notify(){this.dep.forEach(item &#61;> item())}
}
依次注册多个想要执行的函数
const wantCake &#61; new Observer();
wantCake.register(console.log(&#39;call dish&#39;));
wantCake.register(console.log(&#39;call jaks&#39;));
wantCake.register(console.log(&#39;call mejdh&#39;));在完成后通知所有客户并执行函数
wantCake.notify()

在这里插入图片描述
1、init阶段&#xff0c;VUE实例的data属性reactive化&#xff0c;加上get、set方法

function defineReactive(obj: Object, key: String, ...){const dep &#61; new Dep();Object.defineProperty(o, key){get: function reactiveGetter(){...dep.depend();return value;...},set: function reactiveSetter(newVal){...val &#61; newVal;dep.notify();...},enumerable : true,configurable : true}
}
const Dep{static target: ?Watcher;subs: Array<Watcher>;depend () {if (Dep.target) {Dep.target.addDep(this)}}notify () {const subs &#61; this.subs.slice()for (let i &#61; 0, l &#61; subs.length; i < l; i&#43;&#43;) {subs[i].update()}}
}

这里的dep是一个观察者类&#xff0c;每一个属性都有一个dep&#xff0c;调用getter时去dep里注册函数&#xff0c;在调用setter时&#xff0c;执行注册的函数。

2、mount阶段

mountComponent(vm: Component, el: ?Element, ...) {vm.$el &#61; el...updateComponent &#61; () &#61;> {vm._update(vm._render(), ...)}new Watcher(vm, updateComponent, ...)...
}class Watcher {getter: Function;// 代码经过简化constructor(vm: Component, expOrFn: string | Function, ...) {...this.getter &#61; expOrFnDep.target &#61; this // 注意这里将当前的Watcher赋值给了Dep.targetthis.value &#61; this.getter.call(vm, vm) // 调用组件的更新函数...}
}

在mount时会创建一个Watcher类&#xff0c;这个类是链接dep与vue组件的桥梁。每一个watcher对应一个vue component。
在new Watcher()时会调用getter方法&#xff0c;此时会调用render重新渲染函数。
render函数会访问data属性&#xff0c;这时就去调用这个属性的getter函数

// getter函数
get: function reactiveGetter () {....dep.depend()return value....},// dep的depend函数
depend () {if (Dep.target) {Dep.target.addDep(this)}
}

在depend函数中&#xff0c;dep就是watcher对象本身。这样每次渲染这个组件时&#xff0c;如果用到了这个属性&#xff0c;组件对应的watcher都会注册到这个属性的dep中。这个过程被称为依赖收集。
在收集完所有的依赖后&#xff0c;如果这个属性变化&#xff0c;就会通知watcher去更新相关的组件。

3、更新阶段
属性改变时&#xff0c;回去调用dep里面的notify函数&#xff0c;然后通知所有的watcher去调用update函数进行更新。

notify () {const subs &#61; this.subs.slice()for (let i &#61; 0, l &#61; subs.length; i < l; i&#43;&#43;) {subs[i].update()}
}

4、流程展示

reactive属性
setter
Dep
notify
watcher
re-render
VueComponent

5、总结一下
第一步&#xff1a;组件初始化时给data中所有属性添加get、set&#xff0c;reactive化&#xff1b;然后注册一个Watcher对象&#xff0c;此时watcher会立即调用组价你的render去生成虚拟DOM&#xff0c;此时会用到data&#xff0c;所以会触发get函数&#xff0c;将当前的watcher注册到sub里。
第二步&#xff1a;在data属性变化时&#xff0c;会遍历sub中所有watcher对象&#xff0c;通知它们去渲染组件。

借鉴文章&#xff1a;https://zhuanlan.zhihu.com/p/88648401

11.小程序使用过吗

12.性能优化

回答的是&#xff1a;

  • 生命周期的优化
  • CSS spires
  • 懒加载
  • 标签的位置

13.数组去重
  • num &#61; […new Set(num)]
  • 用对象的key
  • 用数组的indexof查找

14.正则&#xff0c;匹配一个电话号码
15.判断素数

function isPrime(num){var n&#61;Math.sqrt(num);for(var i&#61;2;i<&#61;n;i&#43;&#43;){if(num%i&#61;&#61;0){ return false;}}return true;
}console.log(isPrime(3))

16.26进制字符串相加

//输入单行的情况
var readline &#61; require(&#39;readline&#39;); // 引入readline接口&#xff0c;读取输入行
var rl &#61; readline.createInterface({ // 创建输入输出接口input: process.stdin,output: process.stdout
});
//(a-z)26进制转10进制
function convertToTen(str){var num&#61;0,index&#61;1;for(let i&#61;str.length-1;i>&#61;0;i--){num&#43;&#61;((str.charCodeAt(i)-97)%26) * index;index &#61; index * 26;}return num;
}
//10进制转(a-z)26进制
function convertToTwoteenSix(num){var str&#61;&#39;&#39;;while(num!&#61;&#61;0){var temp &#61; num%26;str&#43;&#61;String.fromCharCode(temp&#43;97);num &#61; parseInt(num/26);}//从后往前存储&#xff0c;进行反转return str.split(&#39;&#39;).reverse().join(&#39;&#39;);
}
var inputs &#61; [];
rl.on(&#39;line&#39;, function(line) { // 监听控制台输入var data &#61; line.trim().toLowerCase(); // 获取控制台输var a &#61; convertToTen(data);inputs.push(a);//每隔两行输出一次,并且清空inputs数组if(inputs.length&#61;&#61;&#61;2){console.log(convertToTwoteenSix(inputs[0]&#43;inputs[1]));inputs&#61;[];}
});

//将26进制转10进制var ConvertNum &#61; function (str) {var n &#61; 0;var s &#61; str.match(/./g);//求出字符数组var j &#61; 0;for (var i &#61; str.length - 1, j &#61; 1; i >&#61; 0; i--, j *&#61; 26) {var c &#61; s[i].toUpperCase();if (c < &#39;A&#39; || c > &#39;Z&#39;) {return 0;}n &#43;&#61; (c.charCodeAt(0) - 64) * j;}return n;}//测试var teststr &#61; "AB";alert(ConvertNum(teststr));//将10进制转26进制var Convert26&#61;function(num){var str&#61;"";while (num > 0){var m &#61; num % 26;if (m &#61;&#61; 0){m &#61; 26;}str &#61; String.fromCharCode(m &#43; 64) &#43; str;num &#61; (num - m) / 26;}return str;}//测试var num &#61; 28;alert(Convert26(num));

17.COOKIE和session

在这里插入图片描述

18.rem vh

在这里插入图片描述

vh就是当前屏幕可见高度的1%&#xff0c;也就是说height:100vh &#61;&#61; height:100%;但是当元素没有内容时候&#xff0c;设置height:100%&#xff0c;该元素不会被撑开&#xff0c;此时高度为0&#xff0c;但是设置height:100vh&#xff0c;该元素会被撑开屏幕高度一致。

CDG-fit技术栈记录

  • vue和node
  • 主要偏node

推荐阅读
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 使用nodejs爬取b站番剧数据,计算最佳追番推荐
    本文介绍了如何使用nodejs爬取b站番剧数据,并通过计算得出最佳追番推荐。通过调用相关接口获取番剧数据和评分数据,以及使用相应的算法进行计算。该方法可以帮助用户找到适合自己的番剧进行观看。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 本文介绍了作者在开发过程中遇到的问题,即播放框架内容安全策略设置不起作用的错误。作者通过使用编译时依赖注入的方式解决了这个问题,并分享了解决方案。文章详细描述了问题的出现情况、错误输出内容以及解决方案的具体步骤。如果你也遇到了类似的问题,本文可能对你有一定的参考价值。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 使用正则表达式爬取36Kr网站首页新闻的操作步骤和代码示例
    本文介绍了使用正则表达式来爬取36Kr网站首页所有新闻的操作步骤和代码示例。通过访问网站、查找关键词、编写代码等步骤,可以获取到网站首页的新闻数据。代码示例使用Python编写,并使用正则表达式来提取所需的数据。详细的操作步骤和代码示例可以参考本文内容。 ... [详细]
  • 本文介绍了使用cacti监控mssql 2005运行资源情况的操作步骤,包括安装必要的工具和驱动,测试mssql的连接,配置监控脚本等。通过php连接mssql来获取SQL 2005性能计算器的值,实现对mssql的监控。详细的操作步骤和代码请参考附件。 ... [详细]
author-avatar
Amyjionydp
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有