20190119杂七杂八

584 阅读3分钟

node项目出现HTTP500(Internal Server Error)

这个表明客户端没有问题,是服务器端出了问题,后来发现是服务器端代码出现了问题,我将console.log写成console了。可以通过网页的调试面板中network项来查看axio请求的状态码为500,然后定位那个请求就可以找出哪里出错了。

Parsing error: Using the export keyword between a decorator and a class is not allowed. Please use

解决办法:在eslint配置文件中添加配置项

"parserOptions": {
      "ecmaFeatures": {
        "legacyDecorators": true
      }
    },

react如何更新state中数组中的某个元素

遇到一个问题是如何更新state中数组中的某个元素,之前尝试的做法是this.state.psytest[j++]=e.target.value,这种写法明显就是错误的,必须要写成下面的形式

        var items=this.state.psytest;
        items[(this.state.j)++]=e.target.value;
        this.setState({
            psytest:items
        })

react报错 TypeError: Cannot read property 'setState' of undefined

这个一般就是没有绑定this。在构造函数里绑定this即可,类似下面

this.handleClick=this.handleClick.bind(this);

React中input的值如何获取

一般是利用DOM提供的Event对象的target事件进行取值

 handleChange(e){
        this.setState({
            value:e.target.value
        })

    }

而且要注意,函数参数一般就e一个,不要再额外添加参数,例如

handleChange(key,e){
        this.setState({
            [key]:e.target.value
        })

    }

一般我们处理不同的key时,需要构建不同的handleChange函数,例如

    handleChangeUsername=(event)=>{
        var val=event.target.value;
        this.props.state.username=val;
    };
    handleChangeIdcard=(event)=>{
       var val=event.target.value;
        this.props.state.idcard=val
    };
    handleChangeAge=(event)=>{
       var val=event.target.value;
        this.props.state.age=val;
    };

另一种方法是使用ref属性并通过参考值this.refs

render: function() {
    return (<form onSubmit={this.submitForm}>
        <input ref="theInput" />
    </form>);
},
submitForm: function(e) {
    e.preventDefault();
    alert(React.findDOMNode(this.refs.theInput).value);
}

Reat组件中大量通过import引入图片

这样会使组件看起来很冗余

一个比较好的方法是在public/images/psytest文件下新建一个index.js文件,里面写成

export {default as p1} from './1.png'
export {default as p2} from './2.jpg'
export {default as p3} from './3.png'
export {default as p4} from './4.png'
export {default as p5} from './5.png'
.......

然后我们在要使用这些图片的组件里

import * as images from '../../../public/images/psytest'
 const{p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23,p24,p25,p26}=images;
//通过解构赋值,我们就可以使用单个图片了

这种方法只是将冗余的代码放在了另外的地方,使组件看起来比较干净,还有一种解决方法,即利用**require.context**

const requireContext = require.context("./images", true, /^\.\/.*\.png$/);
const images = requireContext.keys().map(requireContext);

jsx书写的几个注意的地方

一个是this.setState的写法,小括号里面是一个对象,所以要用{}

//正确
this.setState({value:e.target.value})

//正确,带回调函数
this.setState({
    value:e.target.value
},this.handleClick)

//错误,缺少{}
this.setState(value:e.target.value)

//错误,分号多余
this.setState({value:e.target.value;})

下面this.props.state[key]=val这种写法也是要注意的

//父组件
class Parent extends Component{
    constructor(){
        super();
        this.state={
            ...
            username,
            ...
        }
    }
    
    render(){
        return(
        <Son state={this.state} />
        )
    }
}
//子组件
class Son extends Component{
    ...
    handleChange(key,val){
        //要注意这个地方,this.props.state.[key]这样写是不对的
        this.props.state[key]=val;
    };
    ...
  
}

JS match函数的返回值

match函数的用法如下,里面可以是一个字符串或者是要匹配的模式的RegExp对象

stringObject.match(searchvalue)
stringObject.match(regexp)

那么这个函数的返回值是什么呢?

返回匹配结果的数组,该数组的内容依赖于regexp是否具有全局标志g。

**如果regexp没有标志g,**那么match方法就只能在stringObject中执行一次匹配。如果没有找到任何匹配的文本,match将返回null。否则,它将返回一个数组,其中存放了与它找到的匹配文本有关的信息。该数组的第0个元素存放的是匹配文本,而其余的元素存放的是与正则表达式的子表达式匹配的文本。除了这些常规的数组元素之外,返回的数组还含有两个对象属性。index属性声明的是匹配文本的起始字符在stringObject中的位置,input属性声明的是对stringObject的引用。

如果regexp具有标志g,则match将执行全局检索,找到stringObject中的所有匹配子字符串。若没有找到任何匹配的子串,则返回null。如果找到了一个或多个匹配子串,则返回一个数组。不过全局匹配返回的数组的内容与前者大不相同,它的数组元素中存放的是stringObject中所有的匹配子串,而且也没有index属性或input属性。

//下面输出:1,2,3
<script type="text/javascript">
var str="1 plus 2 equal3"document.write(str.match(/\d+/g))
</script>

 
//rs= Array('A', 'B', 'C', 'D', 'E', 'a', 'b', 'c', 'd', 'e');
var str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
var regexp = /[A-E]/gi;(i 指不区分大小写)

var rs = str.match(regexp);
  <body>
        <p>
            前端对于网站来说,通常是指,网站的前台部分包括网站的表现层和结构层。因此前端技术一般分为前端设计和前端开发,前端设计一般可以理解为网站的视觉设计,前端开发则是网站的前台代码实现,包括基本的HTML和CSS以及JavaScript/ajax,现在最新的高级版本HTML5、CSS3,以及SVG等。
        </p>

</p>
        <script type="text/javascript">
            $(function() {
                var arr = new Array(),
                    str = $('p').text();
                //正则表达式无全局标志g
                arr = str.match(/(前端)/);
                //返回结果数组
                console.log(arr);
                //返回结果数组长度 本示例结果为:2
                console.log('返回结果数组长度:' + arr.length);
                //返回结果数组的第一个元素 本示例结果为:前端
                console.log('返回结果数组的第一个元素:' + arr[0]);
                //返回结果数组的第二个元素 本示例结果为:前端
                console.log('返回结果数组的第二个元素:' + arr[1]);
            })
        </script>
    </body>

path-to-regexp工具库的用法

该库用来处理url中地址与参数,JS中有RegExp方法做正则表达式检验,而path-to-regexp可以看成是url字符串的正则表达式

pathToRegexp()

作用:这里这个方法可以类比于 js 中 new ExpReg('xxx')

var pathToRegexp = require('path-to-regexp')

var re = pathToRegexp('/foo/:bar')
console.log(re);    

//打印结果为: /^\/foo\/((?:[^\/]+?))(?:\/(?=$))?$/i

要注意的是它返回的keys数组里面的东西

const regexp = pathToRegexp('/:foo/:bar')
// keys = [{ name: 'foo', prefix: '/', ... }, { name: 'bar', prefix: '/', ... }]
 
re.exec('/test/route')
//=> ['/test/route', 'test', 'route']

exec()

作用:匹配 url 地址与规则是否相符

var pathToRegexp = require('path-to-regexp')

var re = pathToRegexp('/foo/:bar');     // 匹配规则
var match1 = re.exec('/test/route');    // url 路径
var match2 = re.exec('/foo/route');     // url 路径

console.log(match1);
console.log(match2);

//打印结果如下,上述代码中,第一个 url 路径与匹配规则不相符返回 null,第二个 url 路径与匹配规则相符,返回一个数组。
null
[ '/foo/route', 'route', index: 0, input: '/foo/route' ]

要注意它返回的内容

re.exec('/test')
//=> ['/test', 'test', undefined]
 
re.exec('/test/route')
//=> ['/test', 'test', 'route']

parse()

作用:解析 url 字符串中的参数部分(:id)

var pathToRegexp = require('path-to-regexp');

var url = '/user/:id';
console.log(pathToRegexp.parse(url));

//打印结果
[ '/user',
  { name: 'id',
    prefix: '/',
    delimiter: '/',
    optional: false,
    repeat: false,
    partial: false,
    pattern: '[^\\/]+?' } ]

说明:返回一个数组,从第二个数据可以就可以得到 url 地址携带参数的属性名称(item.name)。

当然,url 中携带参数出了 :id 这种形式,还有 /user?id=11 这种,使用 parse() 方法解析自行查看结果。

compile()

作用:快速填充 url 字符串的参数值

var pathToRegexp = require('path-to-regexp')

var url = '/user/:id/:name'
var data = {id: 10001, name: 'bob'}
console.log(pathToRegexp.compile(url)(data))

//打印结果
/user/10001/bob