• 资源日历 踩坑记(一)


    当我遇到了一个很坑的跨域问题

    问题描述: 不知道为什么,就是跨域,我检查了端口号以及域名,都没有问题,但是还是跨域。

    原因: BACKEND_URL='localhost:3000', 这里指定了地址,但是没有指定协议,所以跨域。应该是http://localhost:3000

    总结: 属于同一个域,必须包括 协议、域名、端口号都一致,否则跨域。

    使用margin: 0 auto的前提

    如果想要使用margin: 0 auto;,它有以下几个前提:

    1. 必须是块级元素, inline-block元素也不行。
    2. 必须指定宽度。
    3. 不能使用定位属性以及浮动。

    如何给react组件添加多个class

    这里介绍几种方法:

    1. 简单拼接字符串: <div className={class1 + ' ' + class2}></div>
    2. 使用es6字符串模板拼接字符串: <div className={${class1} ${class2}}></div>
    3. 使用classnames, 先导入模块import classnames from 'classnames', 然后使用<div className={classnames(class1, class2, class3)}></div>, 推荐使用这种。

    如何重写antd的样式

    这里介绍两种方法:

    1. 直接修改组件的类型,如:<Icon className="test-class"/>
    2. 使用global修改,这种情况,一般需要在组件外面包一层,但是不推荐这么用,因为版本升级可能导致意想不到的结果,比如:
    .footer :global(.ant-input-group-adoon) {
      color: red;
    }
    

    关于CSS3不熟悉的用法

    1. box-shadow合成写法以及所表达的意思: none | [inset? && [<offset-x> <offset-y> <blur-radius>?<spread-radius>?<color>? ]]#, 默认阴影在边框外, 使用inset后,阴影就会在边框内。blur-radius值只能为正,值越大,模糊面积越大,阴影就越大越淡。spread-radius值可正可负,正值,阴影扩大,负值,阴影缩小。

    2. border-radius分开写法顺序: border-top-left-radius: 4px

    如何使用babel来测试ES6

    1. 安装babel-preset-es2015, 使用命令cnpm install --save-dev babel-preset-es2015
    2. 配置.babelrc文件
    {
      "presets": ["es2015"]
    }
    
    1. 安装babel-cli,使用命令cnpm install babel-cli -g
    2. 使用babel-node, 它是babel-cli自带的工具,使用命令babel-node main.js来测试main.js文件

    ES6相关

    1. 当导入默认模块时,直接import test from './test'
    2. 当导入非默认模块时, 需要加上括号,如: import { test } from './main'
    3. ...array, 如果const array = [1, 2, 3];,这个扩展运算符的计算结果是1 2 3, 它们之间没有逗号。
    4. array.indexOf('a')这是一个坑,如果要判断是否有的话,应该用是否大于-1来判断,而非直接if (array.indexOf('a') {}), 应该用if (array.indexOf('a') > -1)来判断。
    5. splice()方法,返回的是一个新数组,举例来说,如果使用的是删除,那么返回的就是被删除的元素组成的数组。而被删除元素的数组自然也就少了元素。
    6. ES6实现数组去重的方法: projectName = [...new Set(projectName)]

    react相关

    1. antd的日历组件,如何实现点击日历,改变点击的那天的颜色,这个时候要转变操作DOM的思想,要向react上转,是通过数据来的,因此我们要考虑到使用state或者说是reducer之类的。

    2. antdform组件,如果要验证的话,两种方法,要么写在validator里面, 要么最后提交表单的时候统一验证。如果在统一表单的时候统一验证,this.porps.form.validateFields(err, value){}, 这个函数里,如果有错,一定要return。if (err) {return;}, 不然,最后界面上不会提示出错。

    3. 报错: Warning: React.createElement: type should not be null, undefined, boolean, or number. It should be a string (for DOM elements) or a ReactClass (for composite components). Check the render method of ProjectCalendar., 这个报错我遇到了多次,原因是自己引入模块不小心写错了,比如写了import { Input } from 'react', 实际上应该是: import { Input } from 'antd'

    4. 像报这样的错: Object is undefined, 一定要好好检查是不是导入模块错了,或者是忘了导入模块。

    5. 在使用antd的AutoComplete组件时,想要实时获取输入框里的值, 可以直接使用onSelect(value)方法,value就是实时的值,但是我的需求是实时获取2个AutoComplete组件里的值,我用到了form表单里的getFieldValue()方法,但是在使用的过程中,发现这样并不可以,这个方法获取的并不是实时的,而是上一次onChange或者onSelect后的值。最终的解决办法是,使用state, 调用onSelect或onChange方法后,把当前的值存入state里,并在setState()的方法的回调函数里,进行判断2个值,因为2个值都存到state里面的,所以就可以获取2个AutoComplete里的实时的值了。

    6. 使用antd的mention组件,报错toContentState is not a function, 原因,版本问题。

    reducer相关

    1. 最外层reducers将所有containerreducer组合起来了。

    后端

    1. 表里有个字段设置了unique, 但是在自己插入的时候,那个字段又不是唯一的,所以mongodb报错:11000。就算在代码里将unique去掉,但是它仍然没有反映到数据库里,所以需要将表删除了,重新创建。

    2. 查询请求的时候报错,大概意思是不知道请求的方法是GET还是HEAD, 原因是schema里面的那个validator(), 里面不需要返回任何数据。

    3. Missing or undefind handler, 这是由于方法没有添加到prototype里去。

    4. 当有可能是更新操作,有可能是创建操作的时候,是后端将create以及update的API都提供了,然后前端进行判断,来判断是更新操作还是插入操作。而不是前端一个函数,后端来判断!!!

    ESLINT规则集

    • no-trailing-spaces, 最后面不能跟空格。
    • the closing bracket must be aligned with the line containing the open tag., 闭合括符必须和开标签对齐。
    • using string literals in ref attribute is deprecated, 在ref中使用字符串文字已经被弃用, 这个时候应该使用这种:
    constructor() {
      super();
      this.handleClick = this.handleClick.bind(this);
    }
    
    handleClick() {
      const node = this.btnRef;
    }
    
    return (
      <div>
        <div onClick={this.handleClick}><span ref={(el) => {this.btnRef = el;}}></span></div>
      </div>
    );
    
    • unexpected parentheses around single function argument having a body with no curly braces arrow-parens, 大概意思是如果箭头函数的参数只有一个,那么不需要用()包括起来,其他任何情况都需要用()包括起来。
    • arrow function should not return assignment, 箭头函数禁止返回赋值,也就是在return的时候,禁止赋值语句。
    • visible, non-interactive elements should not have moue or keyboard listeners jsx-ally/no-static-element-interactions, 非可见,非交互元素,不应该就事件监听。
    common interactive roles include:
    
    1. button
    2. link
    3. checkbox
    4. menuitem
    5. menuitemcheckbox
    6. menuitemradio
    7. option
    8. radio
    9. searchbox
    10. switch
    11. textbox
    

    ESLINT 数组部分实践

    数组常用方法实践

    如果要过滤掉['abc', 'abx', 'abm', 'll', 'am']数组里只含有ab的元素如何操作?

    const arr = ['abc', 'abx', 'abm', 'll', 'am'];
    let newArr = arr.filter(item => (item.indexOf('ab') > -1));
    
    // 可以进阶为数组元素为对象
    // 同理,还有其他需要过滤的,不需要专门写判断,直接return就可以了。
    // 同理,map操作也是,不需要专门写判断, 格式也是和上面一样。
    

    如果想要匹配一个数组里的部分和元素和另一个数组的部分元素, 该如何操作?

    const mentionArr = ['yuzf', 'mkmk', 'zhouh', 'yangh', 'klk'];
    const users = [
      {
        name: 'yuzf',
        uid: '1',
      },
      {
        name: 'zhouh',
        uid: '2',
      },
      {
        name: 'yangh',
        uid: '3',
      },
      {
        name: 'yaocl',
        uid: '4',
      },
      {
        name: 'zhaozm',
        uid: '5',
      },
      {
        name: 'hwy',
        uid: '6'
      },
    ];
    
    // 现在需求是这样,mentionArr是用户输入的一堆数据,users是数据库里的数据
    // 我想将输入的一堆数据去和users进行比对
    // 如果users里存在那么mentionArr里的数据,就将users里面的uid给拿到
    let uids = [];
    
    // 1. 先将匹配的users给拿出来
    // 2. 再将uid拿出来
    users.filter(item => (mentionArr.includes(item.name))).forEach(item => (uids.push(item.uid)));
    console.log(uids); // [1, 2, 3]
    
  • 相关阅读:
    JS仿淘宝网顶部的导航菜单
    JS+CSS打造高仿XP默认主题菜单样式
    Jquery打造网页右上角可伸缩关闭的菜单
    来自百度百科的目录显示/隐藏效果
    Jquery打造的下拉层式菜单
    javascript小數位四舍五入[IE5.5+]
    css外容器margin問題[IE中height:100%]
    EXEC执行动态SQL时取出变量值[EXEC函数只能是局部变量]
    sql一列变多列
    判斷日期,輸出成YYYY/MM/DD形式
  • 原文地址:https://www.cnblogs.com/yzfdjzwl/p/6882099.html
Copyright © 2020-2023  润新知