<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[zmjのblog]]></title><description><![CDATA[这个需求不难]]></description><link>https://blog.youkuaiyun.com/qq799028706</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; qq799028706]]></copyright><item><title><![CDATA[VS Code提示To enable project-wide JavaScript/TypeScript language features, exclude large folders with]]></title><link>https://blog.youkuaiyun.com/qq799028706/article/details/147923168</link><guid>https://blog.youkuaiyun.com/qq799028706/article/details/147923168</guid><author>qq799028706</author><pubDate>Tue, 13 May 2025 14:12:54 +0800</pubDate><description><![CDATA[最近使用vscode的时候，老是提示To enable project-wide JavaScript/TypeScript language features, exclude large folders with source files that you do not work on.查了不少资料，终于解决了。这个问题的本质原因是因为项目里过大的文件夹也参与到了编译当中，导致功能启用失败，所以关键就是寻找哪些东西过大了。]]></description><category></category></item><item><title><![CDATA[React 自定义hooks最佳实践]]></title><link>https://blog.youkuaiyun.com/qq799028706/article/details/126851871</link><guid>https://blog.youkuaiyun.com/qq799028706/article/details/126851871</guid><author>qq799028706</author><pubDate>Wed, 14 Sep 2022 14:31:18 +0800</pubDate><description><![CDATA[react hooks推出已经有一段时间了，而自定义hooks在hooks中其实是非常关键的一环，它是抽离业务逻辑和UI逻辑，复用代码的关键]]></description><category></category></item><item><title><![CDATA[node fs文件系统常用操作总结]]></title><link>https://blog.youkuaiyun.com/qq799028706/article/details/125800834</link><guid>https://blog.youkuaiyun.com/qq799028706/article/details/125800834</guid><author>qq799028706</author><pubDate>Fri, 15 Jul 2022 16:03:40 +0800</pubDate><description><![CDATA[原有的fs库应该抛弃了，使用全新的库constfs=require('fs/promises')//以下api均已promise化//读取目录文件和文件夹,options参数一般用不到，可以用来指定编码fs.readdir(path,options)//返回文件类型，此时返回的是数组，每个元素都是文件类Dirent，该类可获取文件名以及判断文件类型fs.readdir(path,{true})//将oldPath重命名为newPath。...]]></description><category></category></item><item><title><![CDATA[常见逻辑谬误整理]]></title><link>https://blog.youkuaiyun.com/qq799028706/article/details/123442665</link><guid>https://blog.youkuaiyun.com/qq799028706/article/details/123442665</guid><author>qq799028706</author><pubDate>Sat, 12 Mar 2022 14:14:05 +0800</pubDate><description><![CDATA[概念以及形式谬误




谬误
本质
典例




偷换概念
在同一论证过程中，概念并没有保持一致
【典例】买一送一。 【分析】两个“一”的含义往往不同


循环定义
在定义过程中，定义项直接或者间接地包含了定义项
【典例】逻辑学是研究逻辑的科学。【分析】用“逻辑”来定义“逻辑学”，实际上并未定含了被定义清楚什么是逻辑学


分解谬误
认为整体具有的性质，部分一定具有
【典例】湖北人能喝酒，焕哥是湖北人。因此，焕哥能喝酒。【分析】喝酒是湖北人整体的特点，焕哥不一定具有认为部分具有的性质，整体一定具有


合]]></description><category></category></item><item><title><![CDATA[H5 挽留弹窗方案设计与实现]]></title><link>https://blog.youkuaiyun.com/qq799028706/article/details/121554116</link><guid>https://blog.youkuaiyun.com/qq799028706/article/details/121554116</guid><author>qq799028706</author><pubDate>Fri, 26 Nov 2021 10:32:32 +0800</pubDate><description><![CDATA[H5 挽留弹窗的设计与实现
背景
运营提出想在用户点击退出，返回的时候，弹窗挽留用户，并通过挽留弹窗引流一些产品，提高转换率，因此挽留弹窗需要实现以下功能，用户点击返回的时候，弹出挽留弹窗。
方案初步设计
经过本人的调研，浏览器没有直接提供类似用户退出的事件监听，因此端外实现的方案都是比较hack的方案。
主要借助history这个API，使用到以下两个方法

history.pushState()：往浏览器里插一条历史记录
window.addEventListener(‘popstate’, (e) =]]></description><category></category></item><item><title><![CDATA[使用JS去除字符串中的HTML标签]]></title><link>https://blog.youkuaiyun.com/qq799028706/article/details/121522487</link><guid>https://blog.youkuaiyun.com/qq799028706/article/details/121522487</guid><author>qq799028706</author><pubDate>Wed, 24 Nov 2021 19:13:11 +0800</pubDate><description><![CDATA[背景
有时候我们经常需要删除掉字符串中的一些HTML标签
下面我推荐两个办法
正则表达式
str.replace(/&lt;[^&gt;]+&gt;/g, '')
使用innerHTML（推荐）
有时候网上的一些正则可能不符合你的需求，此时我们可以通过HTML自带的textContent来解决
const deleteTag = (str) =&gt; {
  const el = document.createElement('div')
  el.innerHTML = str
  return el.]]></description><category></category></item><item><title><![CDATA[element-admin同时使用mock数据和真实后端接口]]></title><link>https://blog.youkuaiyun.com/qq799028706/article/details/114666732</link><guid>https://blog.youkuaiyun.com/qq799028706/article/details/114666732</guid><author>qq799028706</author><pubDate>Thu, 11 Mar 2021 15:03:07 +0800</pubDate><description><![CDATA[背景
系统接入了真实后端接口进行登录，但业务接口还没开发完成，需要mock数据。
方案
一般来说有两种方案

多个server，
启用纯前端mock

这里建议我采取的是第二种方案。
具体操作步骤如下

启用src/main.js下的mockXHR方法，并将环境改成development

在mock文件夹下创建dashboard.js编写mock数据
具体的书写方法可以参考生成的几个mockjs文件，如arcticle.js等

export default [
    {
        url: `/]]></description><category></category></item><item><title><![CDATA[less使用变量减少伪类:nth-child代码]]></title><link>https://blog.youkuaiyun.com/qq799028706/article/details/112003616</link><guid>https://blog.youkuaiyun.com/qq799028706/article/details/112003616</guid><author>qq799028706</author><pubDate>Thu, 31 Dec 2020 10:19:51 +0800</pubDate><description><![CDATA[原有的代码
&amp;:nth-child(1){
    margin-top: 0;
    h4 {
        top: auto;
        bottom: 596 / @s;
    }
    .fixed h4{
        top: 100 / @s;
    }
}

&amp;:nth-child(2){
    h4 {
        top: auto;
        bottom: 465 / @s;
    }
    .fixed h4{
        t]]></description><category></category></item><item><title><![CDATA[iframe高度自适应方案总结]]></title><link>https://blog.youkuaiyun.com/qq799028706/article/details/109313417</link><guid>https://blog.youkuaiyun.com/qq799028706/article/details/109313417</guid><author>qq799028706</author><pubDate>Tue, 27 Oct 2020 16:18:58 +0800</pubDate><description><![CDATA[1. 背景
iframe能将一个网页嵌入到另一个网页中，有个缺陷是高度不能随内容而撑开，需要手动设置。
如果内容高度是动态的，就会存在问题。
在网上查了不少方案都存在一些问题，总结了一下
2. 思路
整体而言思路是：通过scrollHeight获取iframe的滚动高度，动态将iframe.height设置为scrollHeight即可
但是要考虑到两个问题

如果内容是动态改变的，就不能仅仅在window.onload后做一次高度改变
要考虑撑开后又高度又缩小的情况

3. 代码
为了解决上述的两个问题，]]></description><category></category></item><item><title><![CDATA[React-Router 路由传参的几种方式]]></title><link>https://blog.youkuaiyun.com/qq799028706/article/details/109297432</link><guid>https://blog.youkuaiyun.com/qq799028706/article/details/109297432</guid><author>qq799028706</author><pubDate>Mon, 26 Oct 2020 20:02:50 +0800</pubDate><description><![CDATA[1.get传值
路由配置还是普通的配置，如：‘admin’
传参方式如：‘admin?id=‘1111’’
通过this.props.location.search获取url获取到一个字符串’?id=‘1111’
我们可以用url，qs，querystring，浏览器提供的api URLSearchParams对象（do not need to support IE and do not contain array or object）或者自己封装的方法去解析出id的值。
2.动态路由传值
路由需要配置成动]]></description><category></category></item><item><title><![CDATA[vue-router控制台报错You are using the runtime-only build of Vue where the template compiler...]]></title><link>https://blog.youkuaiyun.com/qq799028706/article/details/105674930</link><guid>https://blog.youkuaiyun.com/qq799028706/article/details/105674930</guid><author>qq799028706</author><pubDate>Wed, 22 Apr 2020 10:03:33 +0800</pubDate><description><![CDATA[使用vue-router报错
You are using the runtime-only build of Vue where the template compiler is not available.

今天第一次用vue-router，按照官网的例子抄了一遍
首先在main.js中引入vue-router配置

import Vue from 'vue'
import App from ...]]></description><category></category></item><item><title><![CDATA[windows10系统下安装配置ruby开发环境]]></title><link>https://blog.youkuaiyun.com/qq799028706/article/details/102586233</link><guid>https://blog.youkuaiyun.com/qq799028706/article/details/102586233</guid><author>qq799028706</author><pubDate>Wed, 16 Oct 2019 15:29:35 +0800</pubDate><description><![CDATA[1. 前言
由于ruby在windows下不友好
因此考虑使用wsl来搭建环境，wsl是“Windows Subsystem for Linux”的缩写，顾名思义，wsl就是Windows系统的Linux子系统
使用wsl搭建环境后，使用vscode作为开发环境
以下是搭建过程
2. 配置wsl
可以参考下面这篇文章
WSL 使用指南——02 安装配置
3. 配置vscode
打开vscode，一...]]></description><category></category></item><item><title><![CDATA[win10 vscode搭建go语言开发环境]]></title><link>https://blog.youkuaiyun.com/qq799028706/article/details/102573622</link><guid>https://blog.youkuaiyun.com/qq799028706/article/details/102573622</guid><author>qq799028706</author><pubDate>Tue, 15 Oct 2019 20:00:17 +0800</pubDate><description><![CDATA[1. 下载和安装
golang下载安装比较简单
直接进官网下载即可：https://golang.org/
下载好之后，一直按下一步即可（不用刻意配置环境，安装完自动会配环境）
然后打开win + r打开cmd
输入
go version
# 我的版本：go version go1.13.1 windows/amd64

2. vscode运行
这一步比较坑了，当你创建好go文件，输入hello，...]]></description><category></category></item><item><title><![CDATA[vscode添加第三方库代码提示]]></title><link>https://blog.youkuaiyun.com/qq799028706/article/details/100831197</link><guid>https://blog.youkuaiyun.com/qq799028706/article/details/100831197</guid><author>qq799028706</author><pubDate>Sat, 14 Sep 2019 17:19:59 +0800</pubDate><description><![CDATA[众所周知，JS是门动态语言，对一些代码提示会比较弱
特别是引入一些第三方库，如jQuery, d3等，没有代码提示
有时候写demo的时候，不想引入npm各种包，仅仅需要一个文件的时候
&lt;!--index.html文件--&gt;
&lt;!DOCTYPE html&gt;
&lt;html lang="en"&gt;
&lt;head&gt;
    &lt;meta charset="U...]]></description><category></category></item><item><title><![CDATA[用d3.js画一个柱状图]]></title><link>https://blog.youkuaiyun.com/qq799028706/article/details/100830659</link><guid>https://blog.youkuaiyun.com/qq799028706/article/details/100830659</guid><author>qq799028706</author><pubDate>Sat, 14 Sep 2019 16:54:13 +0800</pubDate><description><![CDATA[1. 前言
涉及到的比较重要的点

Scale（比例尺）
Update、Enter、Exit

2. 比例尺
重点在于比例尺的应用
线性比例尺
domain是定义域，range是值域
可以将定义域放大或者缩写
什么意思呢？ 假设我们的数据长度是[0, 1000]，但是1000这个高度太高了，放不下
我们就可以将其缩小5倍
var y = d3.scaleLinear()
    .domain([...]]></description><category></category></item><item><title><![CDATA[判断一棵树是否是另一颗树的子结构]]></title><link>https://blog.youkuaiyun.com/qq799028706/article/details/100745739</link><guid>https://blog.youkuaiyun.com/qq799028706/article/details/100745739</guid><author>qq799028706</author><pubDate>Wed, 11 Sep 2019 19:00:59 +0800</pubDate><description><![CDATA[1. 题目
输入两棵二叉树A，B，判断B是不是A的子结构。（ps：我们约定空树不是任意一个树的子结构）
2. 思路
注意是B是A的子结构，并不是子树
也就有可能是，A是一颗很大的树，B只是中间一部分树的结构
所以要做的事情就两件

遍历A树，将A树每个节点与B树比较
判断A是否是B的结构（根节点相同）

代码
var compare = (p1, p2) =&gt; {
    // 如果p2遍历...]]></description><category></category></item><item><title><![CDATA[翻转一个单链表]]></title><link>https://blog.youkuaiyun.com/qq799028706/article/details/100714287</link><guid>https://blog.youkuaiyun.com/qq799028706/article/details/100714287</guid><author>qq799028706</author><pubDate>Tue, 10 Sep 2019 22:00:17 +0800</pubDate><description><![CDATA[1. 题目
翻转一个链表
2. 思路
涉及三个节点的关系  前一节点，当前节点，下一节点
打比方说是
A -&gt; B -&gt; C
此时想要变成
A &lt;- B &lt;- C
显而易见，直觉会很容易想到让B-&gt;next 去指向A
但直觉有时候往往容易出错，如果第一步就让B-&gt;next去指向A，那么就会丢失B与C之间的联系
所以在让B指向A之前，我们必须先保存好C节点地址
然...]]></description><category></category></item><item><title><![CDATA[链表中倒数第k个结点]]></title><link>https://blog.youkuaiyun.com/qq799028706/article/details/100713954</link><guid>https://blog.youkuaiyun.com/qq799028706/article/details/100713954</guid><author>qq799028706</author><pubDate>Tue, 10 Sep 2019 21:50:30 +0800</pubDate><description><![CDATA[1. 题目
在一个链表，输出该链表中倒数第k个结点。
2. 思路
可能比较常见的做法是，用一个数组保存链表中的节点，遍历一遍链表，然后输出数组倒数第k个结点
function FindKthToTail(head, k) {
    var tmp = []
    while(head) {
        tmp.push(head)
        head = head.next
    ...]]></description><category></category></item><item><title><![CDATA[从零手写一个Promise]]></title><link>https://blog.youkuaiyun.com/qq799028706/article/details/100637787</link><guid>https://blog.youkuaiyun.com/qq799028706/article/details/100637787</guid><author>qq799028706</author><pubDate>Sun, 08 Sep 2019 20:37:12 +0800</pubDate><description><![CDATA[手写一个promise
分五步走


解决基本状态，即Promise三个状态pending, fulfilled, rejected的转换


解决then方法


支持异步操作


支持链式调用


all和race


1. 解决基本状态
看一段promise代码
const promise = new Promise((resolve, reject) =&gt; {
        con...]]></description><category></category></item><item><title><![CDATA[js 中 new 与 Object.create()的区别]]></title><link>https://blog.youkuaiyun.com/qq799028706/article/details/100046454</link><guid>https://blog.youkuaiyun.com/qq799028706/article/details/100046454</guid><author>qq799028706</author><pubDate>Fri, 23 Aug 2019 21:39:27 +0800</pubDate><description><![CDATA[前言
在js中，创建对象有三种方式

{} // 对象字面量
new Object()
Object.create()

1和2的区别很小，1不能传参，2可以传参。
new Object() 和Object.create() 区别就比较大了
1. new关键字
new 关键字做了几件事

创建一个新对象
将新对象的原型指向构造函数的原型
执行构造函数，绑定this
返回这个对象

比如创建一个Ca...]]></description><category></category></item></channel></rss>