React 工作踩坑总结1

1、如何让被遮挡层可以进行事件点击(纯CSS方法)

项目中有一个图片挡住一列文本的点击事件,本来想的是把层级提高,但是提高层级后,页面往上滑后,字又会浮到图片上面,或者是写个函数去判断字体到底部的距离,然后根据距离去调整这个层级关系,但是这个有点麻烦

最后经过查阅资料,可以通过css直接调整:

外层(被遮挡的层){
pointer-events: none;
}

内层(要发生事件的层){
pointer-events: auto;
}

取值none:元素永远不会成为鼠标事件的target

取值auto:与pointer-events属性未指定时的表现效果相同(即将元素恢复成为鼠标事件的target)

2、css控制页面文字不能被选中      user-select:none;

现象:html中可能有些地方不想让用户复制文字,或是用a标签做了个点击按钮,点快的时候文字会被选中,很丑,这个时候可以使用下面的方案禁止文字选中。


原因:鼠标点快了文字会被选中。


解决方案:不同的浏览器设置的内容不一样,user-select不是一个W3C的标准,浏览器的支持不完成,需要对不同的浏览器进行调整。

​
body{

-moz-user-select:none;/火狐/

-webkit-user-select:none;/webkit浏览器/

-ms-user-select:none;/IE10/

-khtml-user-select:none;/早期浏览器/

user-select:none;

}

​

3、解决flex布局space-between最后一行没有左对齐的问题

在最后一行,留下一个宽度一样的占位盒子

.main:after { content: ""; width: 100px; }

flex布局2个p标签垂直居中:

display: flex;
flex-direction: column;
align-items: center;

4、关于服务端渲染

之前没有接触过服务端渲染,在来公司后接触了一些,一直没有做记录,现在做一些常见问题的解决方法总结:

服务端渲染(Server-Side Rendering),简称SSR,是指由服务侧完成页面的 HTML 结构拼接的页面处理技术。一般用于解决 SEO 问题和首屏加载速度问题。由于 SSR 是在非浏览器环境执行 JS 代码,所以会出现很多问题:

问题一:DOM/BOM 缺失

SSR 是在 node 环境下运行 React 代码,而此时 window、document、navigator 等全局属性没有。如果直接使用了这些属性,就会报错 window is not defined, document is not defined, navigator is not defined 等问题,项目中也出现了好多次该问题,通常的解决方法是:

1、通过typeof window !== 'undefined'来判断, 判断window存在再去执行下面代码。

typeof window !== 'undefined' && window.document && window.document.createElement  

2、查阅资料发现另一种方法:

将访问 DOM/BOM 的方法放在 useEffect 中(服务端不会执行),避免服务端执行时报错

React.useEffect(() => {
   SetElement(document.createElement );
}, [])

5、next.js antd 配置 ConfigProvider 中文 zh_CN 时出错

根据文档 国际化 - Ant Design 使用 ConfigProvider 在page ---- _app.tsx全局配置国际化文案时,出现如下错误

import Pagination from "rc-pagination/es/locale/zh_CN";
       ^^^^^^^^^^

SyntaxError: Unexpected identifie

解决方案:

把 import zhCN from 'antd/es/locale/zh_CN'  改成   

import zhCN from 'antd/lib/locale/zh_CN'

6、后端返回文件流,前端处理并下载文件

在前后端分离开发的项目中,前端无论使用Vue或React哪种框架,发送HTTP请求都会使用Ajax异步请求的方式。在很多项目中都会选择使用 axios 发送请求。但是在使用 axios 实现下载功能时,往往会出现以下问题。

当前端直接使用 axios 去请求下载文件的 api 接口时,状态码返回200,但是获取的数据却是一堆乱码,效果如下:

下载其实是浏览器的内置事件,浏览器的 GET请求(frame、a)、 POST请求(form)具有如下特点:

  • response 会交由浏览器处理;
  • response 内容可以为二进制文件、字符串等。

但是AJAX请求不一样:

  • response 会交由 Javascript 处理;
  • response 内容只能接收字符串才能继续处理。

因此,AJAX本身无法触发浏览器的下载功能。

解决:

要在 axios 的 config 配置 responseType: ‘blob’ (非常关键),服务端读取文件,以 content-type: ‘application/octet-stream’ 的格式返回前端,前端接收到数据后使用 Blob 来接收数据,并且创建a标签进行下载。

一个对象的类型取决于 responseType 的值,当值为 “blob”时表示 response 是一个包含二进制数据的 Blob 对象。
在使用 axios 发起请求前,首先了解一下 responseType 这个属性是如何在 axios 中使用的。以 axios 最常用的 get 和 post 请求为例,这两种请求方式在传递参数的时候也是不同的:
在get请求当中,config 是第二个参数,而到了 post 里 config 变成了第三个参数,这是传递 responseType 第一个需要注意的地方。

// axios设置reponseType的方式应该类似下面
const url = '/v1/exportUser'

// get、delete、head 等请求

axios.get(url, {params: {}, responseType: 'blob'})
.then((res) => {})
.catch((err) => {})

// post、put、patch 等请求

axios.post(url, {...params}, {responseType: 'blob'})
.then((res) => {})
.catch((err) => {})

 例如:

其中,downloadBlobFile函数如下:

export function downLoadBlobFile(data: any, headers: object, fileName: string) {
  // 此处当返回json文件时需要先对data进行JSON.stringify处理,其他类型文件不用做处理
  //const blob = new Blob([JSON.stringify(data)], ...)
  const blob = new Blob([data], { type: headers['content-type'] })
  let link = document.createElement('a')
  let url = window.URL.createObjectURL(blob)
  link.href = url
  link.download = fileName
  link.style.display = 'none'
  document.body.appendChild(link)
  link.click()
  link.parentNode.removeChild(link)
  window.URL.revokeObjectURL(url)
}

export default downLoadBlobFile

 7、react实现语音播放功能

编写语音播放函数:

const synth = window.speechSynthesis
  const msg = new SpeechSynthesisUtterance()
  const handleSpeak = (text) => {
    msg.text = text;     // 文字内容: 哈哈哈哈哈
    msg.lang = "zh-CN";  // 使用的语言:中文
    msg.volume = 1;      // 声音音量:1
    msg.rate = 1;        // 语速:1
    msg.pitch = 1;       // 音高:1
    synth.speak(msg);    // 播放
  }


调用即可:

  React.useEffect(() => {
    handleSpeak('啊哈哈哈')
  }, [])

 

8、Docker Desktop提示“Docker Desktop Stopped”解决方案

Docker Desktop提示“Docker Desktop Stopped”解决方案_宇航员写代码的博客-CSDN博客

9、Proxifier打开后,本地项目启动一直会拒绝服务

把default改成direct,然后确定保存重启

 

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值