React动态改变class来切换样式
React有个库的名字叫classnames可以用来动态控制JS中class的逻辑,并且可以绑定写好的样式,以配合CSS的Hash
1 | import style from "./RightBar.scss"; //加载写好的样式 |
如果觉得这样太麻烦可以简单点写
1 | import classnames from "classnames/bind"; |
React有个库的名字叫classnames可以用来动态控制JS中class的逻辑,并且可以绑定写好的样式,以配合CSS的Hash
1 | import style from "./RightBar.scss"; //加载写好的样式 |
如果觉得这样太麻烦可以简单点写
1 | import classnames from "classnames/bind"; |
与文章ES6文内件多个Clss时WebStorm不能自动补全中提到的作用域错误时无法自动补全但是不会报错不同,在使用Redux的Connect时,如果使用错了作用域会直接报错
1 |
|
需求是不同的Menu标题要有不同的Icon图标
1 | import FaEye from "react-icons/fa/eye"; |
在写JSX的时候经常会有这个需求,一个Component中有多个子Component都写在一个文件里
虽然有时候页面可以正常运行,但是 WebStorm却不会对其自动补全
1 | import FaBars from "react-icons/fa/bars"; |
搞得我很困惑,为了让其能自动补全,我发现可以通过大括号强行让其按JavaScript解析而不是JSX
1 | //妥协的解决方案 |
后来满满了解了ES6之后,才发现是变量作用域的问题啊。。。。class是个变量,需要声明后才能被WebStorm自动补全
1 | import FaBars from "react-icons/fa/bars"; |
其实在写代码中不管怎么写都可以运行,但是这里牵扯到了两个知识点值得注意
在ES6中有两个Object的扩展用法
用于判断两个对象是否相等,ES6提出“Same-value equality”(同值相等)算法,用来解决这个问题。Object.is就是部署这个算法的新方法。它用来比较两个值是否严格相等,与严格比较运算符(===)的行为基本一致
1 | Object.is('foo', 'foo') // true |
用于合并对象,当做对数据的更新逻辑时,功能类似于Java里的Dozer库
1 | var target = { a: 1 }; |
该方法有个特性,如果目标对象与源对象有同名属性,或多个源对象有同名属性,则后面的属性会覆盖前面的属性,那么我们就可以用来对对象做更新操作
1 | var source = {key:"1"} |
这里我们把target设定成一个空对象,在完成了assgin之后返回target,由于需要update的信息在source之后,所以update的数据覆盖了元数据,又将source对象重新指向返回的target完成更新
React的入门文章一大堆,我也就不絮絮叨叨的讲了,请参考阮一峰React系列的文章 本文只对一些教程中没有提到的,忽略了初学者的困惑的技术点进行补充。
在React的文件里,编程时可能会出现3种样式的语言,但是这3种样式都属于JavaScript分别是
语言样式 | 代表词 | 解释 |
---|---|---|
CommonJS | require、ReactDOM.render、React.createClass | 这个是node默认支持的JS的写法 |
ES6 | import、export、extends | 这是ECMAScript 6的简称,是JavaScript写法的一个变种,类似CoffeeScript |
JSX | 在render的返回值里 | JSX是Facebook为了React提出一种解析语言,仅仅在render的返回值里 |
1 | //CommonJS |
不管使用哪种写法,在render里的 return()内部才是JSX的部分 一种看上去像HTML实际是JavaScript的语言格式,
如果想在JSX内部嵌套使用JavaScript的变量,需要加入大括号
1 | return ( |
详细的ES教程请参考阮一峰的ES6教程
ES6中变量定义有3种方式var、const、let,其中let存在严格的作用域概念,必须先声明后使用,而const和var则和传统JavaScript的一样,由此引发了很多疑问
ES6存在一种赋值方法叫解构赋值
1 |
|
ES6中对模块的链接使用的是import和export关键词,类似于其它语言中的include和import一样,但是稍微有些不同的是,ES6可以export多个文件
1 | //file.jsx |
当我使用import加载上述文件的时候
1 | import custom from "file.jsx" //使用custom作为名字加载default的export |
参考文章对目录进行import可以直接从目录导入
ES6中有一个常用的语法糖叫做 Arrow Function
1 | const example = param => value |
这句话准确的描述是: 定义了一个example的const变量,变量指向一个匿名方法的方法,方法带有一个参数param,方法内部直接返回value 用传统的JS来写就是
1 | var example = funcation(param) { |
除了以上之外箭头函数还可以使用小括号来包裹多个参数,和大括号执行多条语句而不是直接返回
1 | const example = (param1,param2) => { |
从上文可以看出,大括号是可以不进行return的,小括号还可以用来包裹直接返回的Object对象,例如以下两种是等价的
1 | //使用小括号直接返回对象 |
在CSS中大于号表示为子选择器(Child Selector) 而两个元素并列 div p 对应于JQuery中的Children()方法,只会返回第一级子元素
1 | <body> |
如果我采用
1 | body div:first-child |
来选取会得到 one 和 three 虽然first-child限定了div必须为第一个子元素,但是three本身不仅为one的子元素,也是body的子元素,只是不是第一级
甚至采用
1 | body div:nth-child(1) |
也是仅仅限制了第一个子元素,而不是第一级的第一个子元素
所以应该采用
1 | body >div:first-child |
才能正确选择到one,使用大于号限定在body下的 第一级子元素中选择第一个子元素
其中odd意思是奇数,even意思是偶数
1 | p:nth-of-type(odd) |
上述用到的是CSS3里的nth选择,其一共分为四个,而nth代表什么意思。。。我没有查到。。fuck。。。
选择器 | 示例 | 解释 |
---|---|---|
:nth-child(n) | p:nth-child(2) | 选择每个p元素是其父级的第二个子元素 |
:nth-last-child(n) | p:nth-last-child(2) | 选择每个p元素的是其父级的第二个子元素,从最后一个向前计数 |
:nth-of-type(n) | p:nth-of-type(2) | 选择每个p元素是其父级的第二个p元素 |
:nth-last-of-type(n) | p:nth-last-of-type(2) | 选择每个p元素的是其父级的第二个p元素,从最后一个向前计数 |
可以看出 除了last这个关键字可以改变计数方向以外 还有 child 和 type 两种选择方式
通过百度我们得知
1 | <div> |
nth选择器除了使用数字之外,还可以使用循环公式 an+b ,例如
1 | ele:nth-child(3n+4) 会去匹配第 4, 7, 10, 13 个元素 |
参考文章Linux开机自启动的脚本,我们需要准备可以用的Nginx和Jetty脚本
Nginx的脚本可以从Nginx官网推荐脚本下载到,下好后需要更改两处
1 | //指定本机的Nginx的Home路径 |
Jetty的脚本可以去Jetty服务器的bin目录下拷贝 jetty.sh 脚本,然后在其中添加
1 | JETTY_HOME="/usr/local/jetty/" |
来指定本机的Jetty的Home路径
修改后的官网脚本
1 | #!/bin/sh |
tag:
缺失模块。
1、请确保node版本大于6.2
2、在博客根目录(注意不是yilia根目录)执行以下命令:
npm i hexo-generator-json-content --save
3、在根目录_config.yml里添加配置:
jsonContent: meta: false pages: false posts: title: true date: true path: true text: false raw: false content: false slug: false updated: false comments: false link: false permalink: false excerpt: false categories: false tags: true