React学习笔记

React学习笔记

mobx基础属性了解

observable(观察对象)

观察变量变化,如果变量发生变化会自动触发自动执行函数(autorun(()=>{});)。

代码示例
import { observable, autorun } from 'mobx';

const value = observable(0);
const number = observable(100);

autorun(() => {
  console.log(value.get());
});

value.set(1);
value.set(2);
number.set(101);
说明
可观察的可以用来观测一个数据,这个数据可以数字,字符串,数组,对象等类型(相关知识点具体会在后文中详述),而当观测到的数据发生变化的时候,如果变化的值处在自动运行中,那么自动运行就会自动执行。
上例中的自动运行函数中,只对值值进行了操作,而并没有数量值的什么事儿,所以number.set(101)这步并不会触发自动运行,只有值的变化才触发了自动运行。
observer(可观察对象)

把组件变成响应式组件,以确保组件渲染中使用的数据变化时都可以强制刷新组件

computed(计算属性)
代码示例
const number = observable(10);
const plus = computed(() => number.get() > 0);

autorun(() => {
  console.log(plus.get());
});

number.set(-19);
number.set(-1);
number.set(1);
说明
依次输出了true,false,true。
第一个true是number初始化值的时候,10>0为true没有问题。
第二个false将number改变为-19,输出false,也没有问题。
但是当-19改变为-1的时候,虽然number变了,但是number的改变实际上并没有改变plus的值,所以没有其它地方收到通知,因此也就并没有输出任何值。
直到number重新变为1时才输出true。

React生命周期函数

[图片上传失败...(image-da8dc1-1588151050760)]

constructor():构造函数

执行时间:组件被加载前最先调用,并且仅调用一次
作用:定义状态机变量
注意:第一个语句必须是super(props),正确定义状态机代码如下

constructor(props) {
    super(props);
    this.state = {
      content:null,
    }
  }

如果第一句不使用super(),错误代码及报错如下

constructor(props) {
    this.state = {
      content:null,
    }
  }
'this' is not allowed before super()
componentWillMount()

执行时间:组件初始渲染(render()被调用前)前调用,并且仅调用一次
作用:如果在这个函数中调用setState改变某些状态机,react会等待setState完成后再渲染组件
注意:子组件也有componentWillMount函数,在父组件的该函数调用后再被调用

render()

执行时间:componentWillMount之后,componentDidMount之前,
作用:渲染挂载组件
触发条件:(1)初始化加载页面 (2)状态机改变setState (3)接收到新的props(父组件更新)
注意:组件所必不可少的核心函数;不能在该函数中修改状态机state

componentDidMount()

执行时间:render之后被调用,并且仅调用一次
作用:渲染挂载组件;可以使用refs(备注:React支持一个特殊的属性,你可以将这个属性加在任何通过render()返回的组件中。这也就是说对render()返回的组件进行一个标记,可以方便的定位的这个组件实例。)
注意:子组件也有该函数,在父组件的该函数调用前被调用;如果在该函数中修改某些状态机state,会重新渲染render组件,所以有些组件为减少渲染次数,可以将某些修改状态机的操作放在componentWillMount函数中;如果需要再程序启动显示初始化页面后从网路获取数据,可以将网络请求代码放在该函数中

componentWillReceiveProps(nextProps)

执行时间:组件渲染后,当组件接收到新的props时被调用;这个函数接收一个object参数(新的props);props是父组件传递给子组件的。父组件发生render的时候子组件就会调用
作用:渲染挂载组件;可以使用refs(备注:React支持一个特殊的属性,你可以将这个属性加在任何通过render()返回的组件中。这也就是说对render()返回的组件进行一个标记,可以方便的定位的这个组件实例。)
注意:react初次渲染时,该函数并不会被触发,因此有时该函数需要和componentWillMount或componentDidMount组合使用;使用该函数一定要加nextProps参数,首次使用了解的可以先打印结果(console.log(nextProps))

shouldComponentUpdate(nextProps, nextState)

执行时间:组件挂载后(即执行完render),接收到新的state或props时被调用,即每次执行setstate都会执行该函数,来判断是否重新render组件,默认返回true;接收两个参数:第一个是心的props,第二个是新的state。
作用:如果有些变化不需要重新render组件,可以在该函数中阻拦
注意:该方法在初始化渲染的时候不会调用,在使用forceUpdate方法的时候也不会

componentWillUpdate()

执行时间:在接收到新的props 或者 state,重新渲染之前立刻调用,在初始化渲染的时候该方法不会被调用
作用:为即将发生的重新渲染做一些准备工作
注意:不能再该函数中通过this.setstate再次改变状态机,如果需要,则在componentWillReceiveProps函数中改变

componentDidUpdate()

执行时间:重新渲染后调用,在初始化渲染的时候该方法不会被调用
作用:使用该方法可以在组件更新之后操作DOM 元素

componentWillUnmount()

执行时间:组件被卸载前调用
作用:在该方法中执行任何必要的清理,比如无效的定时器,或者清除在 componentDidMount 中创建的 DOM 元素。

React路由传递参数

1.query方式(在刷新页面的时候,参数丢失)
传递参数示例代码:
class Test extends React.Component{
    render(){
        //参数
        const data={id:'123'};
        const path = {
            //跳转页面地址
            pathname:'/getParams',
            //需要传递的参数
            query:data
        }
        return(
            <div>
                <Link to={path}>超链接1</Link>
            </div>
        )
    }
}
export default Test;
接受参数示例代码:
class getParams extends React.Component{
    constructor(props) {
        super(props);
    }
    render(){
        //在props对象中获取query对象
        const data=this.props.location.query.id;
        return(
            <div>
                接收到的参数:{data}
            </div>
        )
    }
}
export default getParams;
2.state(在刷新页面的时候,参数不会丢失)

使用方式同query方式。

传递参数示例代码:
class Test extends React.Component{
    render(){
        //参数
        const data={id:'123'};
        const path = {
            //跳转页面地址
            pathname:'/getParams',
            //需要传递的参数
            state:data
        }
        return(
            <div>
                <Link to={path}>超链接1</Link>
            </div>
        )
    }
}
export default Test;
接受参数示例代码:
class getParams extends React.Component{
    constructor(props) {
        super(props);
    }
    render(){
        //在props对象中获取query对象
        const data=this.props.location.state.id;
        return(
            <div>
                接收到的参数:{data}
            </div>
        )
    }
}
export default getParams;

ecology9开发注意点

  • 当使用WeaBrowser组件想使用的标准浏览按钮在API文档上不存在时
在数据库中查询wf_browser_config表type字段则为组件中type值

学习中遇到的问题

  • 1.nginx在使用反向代理连接ecology与react_dev环境时访问异常缓慢。
原因是由于nginx.conf中本地ip使用的是“localhost”方式,将“localhost”修改为“127.0.0.1”之后问题得到解决,具体“localhost”不可使用的原因有待研究。
  • 2.render中的return如果存在多个元素标间的话会报错。
当继承React.Component时return中的元素需要有一个最外层的"div"标签进行包裹,代码如下
class Report extends React.Component {
   render() {
       return (
           <div>
           <WeaTop
               title={<span style={{ color: '#f00' }}>标题</span>}
               icon={<i className='icon-portal-workflow' />}
               iconBgcolor='#55D2D4'
               buttons={btns}
           />
           <WeaRadioGroup config={config} onChange={(params)=> {console.log('params', params)}}/>
               </div>
       )
   }
}
  • 报错:Uncaught TypeError: Super expression must either be null or a function, not undefined
出现这个问题百分之99.99是因为单词写错了,反正我是把Component写成了Components
  • 报错: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).Uncaught Invariant Violation: Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: undefined.
出现这个问题,我也搞了很久,最后把  import { Foot } from './foot.js'  改成了 import Foot from './foot.js' 就解决了,使用export default时,对应的import语句不需要使用大括号,不使用export default时,对应的import语句需要使用大括号。
  • 使用getInitialState()返回state在return及方法中获取state默认值返回“unidentified”,错误代码如下
getInitialState () {
        this.setState({
            submitloading:false,
            //是否显示凭证字固定值字段
            showpzzgdz:false
        })

        return{}
    }
错误原因分析:getInitialState()方法只会被调用一次;返回值将会被当成this.state的初始值;
正确代码:
 getInitialState () {
        return{
            submitloading:false,
            //是否显示凭证字固定值字段
            showpzzgdz:false
        }
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 3. JSX JSX是对JavaScript语言的一个扩展语法, 用于生产React“元素”,建议在描述UI的时候...
    pixels阅读 7,949评论 0 24
  • 安装: 概述 React起源于FaceBook的内部项目,因为该公司对市场上所有的JavaScript MVC框架...
    姒沝無痕阅读 4,046评论 0 0
  • 作为一个合格的开发者,不要只满足于编写了可以运行的代码。而要了解代码背后的工作原理;不要只满足于自己的程序...
    六个周阅读 12,712评论 1 33
  • React 核心思想 —— 组件化React 将界面分成了一个个组件,通过组件的组合、嵌套构成页面。其中,组件可复...
    sylvia_yue阅读 4,722评论 1 2
  • Learn from React 官方文档 一、Rendering Elements 1. Rendering a...
    恰皮阅读 7,530评论 2 3

友情链接更多精彩内容