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-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