react小记

Posted 左直拳

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了react小记相关的知识,希望对你有一定的参考价值。

折腾。

这2天弄了一下react,觉得比较绕,记录一下。

1、控件嵌套
自定义控件内部再嵌套其他控件。主要是外层这个控件,代码里要处理一下,将嵌套在自己里面的控件或内容展示出来。
比如:


const b1 = 
  height: '400px',

const sb1 = JSON.stringify(b1)
。。。
<Block title="备案申请" style=sb1>
     <Button type="primary">
       太空飞船租赁业务备案
     </Button>
</Block>

其中,<Block>是自定义控件。它是一个方框。按这里的意图,是要在里面放一个按钮。

Block的完整代码:

import React,  Component  from 'react'
import PropTypes from 'prop-types'
import ReactDOM from 'react-dom'
import  title  from '@/defaultSettings'

const b = 
  margin: '5px',
  border: 'solid 1px #007ACC',

const bTitle = 
  backgroundColor: '#007ACC', //驼峰法
  minHeight: '25px',
  color: '#fff',
  fontSize: '14px',


class Block extends Component 
  constructor(props) 
    super(props)
    this.state = 
  

  static propTypes = 
    children: PropTypes.node,
  

  getStyle = (self) => //设置样式
    if (!self.props.style) return b

    let b2 = JSON.parse(JSON.stringify(b))
    let styles = JSON.parse(self.props.style)
    for (let key in styles) 
      let s = styles[key]
      b2[key] = s
    
    return b2
  

  render() 
    return (
      <>
        <div style=this.getStyle(this)>
          <div>
	        <!-- 对应页面中的 title="备案申请" style=sb1 -->
            <div style=bTitle>this.props.title</div>
          </div>
          <div>
	        <!-- 输出嵌套内容 -->
            <ul>this.props.children</ul>
          </div>
        </div>
      </>
    )
  


export default Block

2、控件设置
假设我要改变一个文本框里的值,该怎么办呢?

如果是VUE,很简单,绑定一个vue变量就可以了。而在react中,也是差不多的做法。

以下代码很简单,就是一个下拉框,一个文本框。当下拉框改变选项的时候,将值写入文本框。主要是文本框绑定了变量tenantValue,而tenantValue又指向了控件中的state.tenantValue。这样下拉框改变选项时将值赋给state.tenantValue即可改变文本框值。这一点可以说,react没有vue那么简洁,比较绕。为什么不能直接操作一个变量呢?非要通过state进行传递。比较绕是react这几天给我的感觉。

class Login extends Component 
  state = 
    tenantValue: '10001',
  

  changeCategory = (value) => 
    this.setState( tenantValue: value )
  

  render() 
    const  tenantValue  = this.state 

    return (
      <div>
            <Select
              defaultValue="10001"
              onChange=this.changeCategory
            >
              <Option value="10001">太空飞船经营人</Option>
              <Option value="10002">太空管理机构</Option>
            </Select>
            <Tenant
              name="tenantCode"
              defaultValue=tenantValue
            />
      </div>
    ) //end of return
   //end of render


export default Login

react组件有2个对象:state和props。props 是传递给组件的(类似于函数的形参),而 state 是在组件内被组件自己管理的(类似于在一个函数内声明的变量)。state 和 props 主要的区别在于 props 是不可变的,而 state 可以根据与用户交互来改变。这就是为什么有些容器组件需要定义 state 来更新和修改数据。 而子组件只能通过 props 来传递数据。

3、一些古怪的语法
比如:

    //相当于 const type = this.state.type
    const  type  = this.state

再比如:

import  connect  from 'dva'

@connect(( login, loading ) => (
  login,
  submitting: loading.effects['login/login'],
))
class Login extends Component 

@connect的作用是建立Login类的State和Props的映射关系。connect接收一个函数,返回一个函数。
@是一个语法糖。在这里,@connect相当于,传入Login,返回建立了State和Props映射关系的新Login
如果没有这个修饰符,是这样写的:

  export default connect(Login => 
    ……
  )(Login)

注解会自动在 Login 组件外面包裹一层 Connect 组件,这个组件把 redux 状态树中我们需要的值传入 Login 组件的 props 中。

又比如

( login, loading ) => (
  login,
  submitting: loading.effects['login/login'],
)

// 等于以下代码
function (state) 
  var login = state.login;
  var loading = state.loading;
  return 
    login: login,
    submitting: loading.effects['login/login'],
  ;
 

4、小结
为什么一个前端,会搞得如此复杂。这其中,一部分是react自己的原因;也有一部分是es6、es7的原因。

以上是关于react小记的主要内容,如果未能解决你的问题,请参考以下文章

React 性能 debug 小记

react-router 从 v3 版本升到 v4 版本,升级小记

React16.7 hooks之setTimeout引发的bug小记

React axios 使用 http-proxy-middleware 解决跨域问题小记

React Native 小记解决嵌套内的 TouchableHighlightTouchableOpacity 等组件onPress误触发

React Native 小记解决 Android 打包后闪退Error: E/SoLoader: couldnot find DSO to load: libhermes.so