ReactNative碎片整理之ref

概述

ref属性是一个特殊的属性,可以把它挂载到任何组件

它可以是一个回调函数(也可以是一个字符串,基本废弃这种用法)

这个回调函数在组件被挂载后立即被执行,应用到的组件作为参数传递

回调函数可以立即使用组件,也可以将参数的组件引用保存起来,后续使用(调用组件方法或者获取组件参数)

ref属性指定回调方法

栗子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
import React, {Component} from 'react';
import {
View,
Text,
StyleSheet,
} from 'react-native';


export default class App extends Component<Props> {
// 构造
constructor(props) {
super(props);
// 初始状态
this.state = {
result: '点击前'
};
}

render() {
return (
<View style={styles.content}>
<Text style={styles.button} onPress={
() => {
this._Test.print()
}
//() => {
// this.setState((prestate, props) => {
// console.warn("setState")
// return {result: '点击了'}
// })
}
}>{this.state.result}</Text>
<RefTest ref={
//指定ref属性的回调函数
(e) => {
console.warn("ref的回调执行了!")
//参数e则为当前RefTest组件的引用
this._Test = e;
}
}>
</RefTest>
</View>
)
}
}

const styles = StyleSheet.create({
content: {
flex: 1,
backgroundColor: '#00a056',
flexDirection: 'row'
},
button: {
padding: 30,
backgroundColor: '#ffffff',
fontSize: 17,
alignSelf: 'center'
},
text: {
padding: 30,
backgroundColor: '#ffffff',
fontSize: 30,
}
})

class RefTest extends Component<Props> {

// 构造
constructor(props) {
super(props);
// 初始状态
this.state = {
data: 'old'
};
}

print() {
this.setState((preState, props) => {
return {
data: 'new'
}
})
console.warn("print方法执行了:" + this.state.data)
}

render() {
return (
<View style={{
alignSelf: 'center',
left: 10,
backgroundColor: '#ffff00',
}}>
<Text style={styles.text}>
当前数据:{this.state.data}
</Text>
</View>
);
}
}

可以看到:

  • 父组件拥有的子组件,子组件有ref属性
  • 首次进入的时候,组件初次绑定 ref的回调会执行一次,父组件保存该引用
  • 点击后,使用组件引用,调用组件方法print
  • 若点击后,父组件setState,则子组件 卸载后,重新调用子组件Rend()方法,这个过程,子组件的ref回调会被调用两次(卸载一次,挂载一次)

需要知道的:

  • 在父组件在子组件指定ref的回调中保存引用对子组件的
  • 这个回调在父组件每次setState(父Render()调用)
  • 组件的render方法被调用时,ref才会被调用,组件才会返回ref
  • setState涉及先卸载,后挂载,ref回调执行两次
文章目录
  1. 1. ref属性指定回调方法
    1. 1.1. 栗子: