react native 中View組件中的ref屬性是什麼

来源:http://www.cnblogs.com/gdsblog/archive/2017/06/26/7078973.html
-Advertisement-
Play Games

在用Reactnative寫工程時,預設奇妙的有一種像OC中,或者Java 中或者當前類的私有屬性的想法,state 和props都不能滿足時,就是ref 它能達到其他語言中持有一個view組件,並且局部的刷新 ref 接受值為string類型的參數或者一個函數function 需要提醒大家的是,只 ...


在用Reactnative寫工程時,預設奇妙的有一種像OC中,或者Java 中或者當前類的私有屬性的想法,state 和props都不能滿足時,就是ref  

它能達到其他語言中持有一個view組件,並且局部的刷新

ref 接受值為string類型的參數或者一個函數function

callback。這一特性讓開發者對ref的使用更加靈活。
render() {
    return <TextInput ref={(c) => this._input = c} />;
  },
  componentDidMount() {
    this._input.focus();
  },

    1
    2
    3
    4
    5
    6
    7

    1
    2
    3
    4
    5
    6
    7

render(){
    return <View ref={ (e) => this._view = e } />//將組件view作為參數賦值給了this._view
}
componentDidMount(){
    this._view.style = { backgroundColor:'red',width:100,height:200 }
}

 

需要提醒大家的是,只有在組件的render方法被調用時,ref才會被調用,組件才會返回ref。如果你在調用this.refs.xx時render方法還沒被調用,那麼你得到的是undefined。 
心得:ref屬性在開發中使用頻率很高,使用它你可以獲取到任何你想要獲取的組件的對象,有個這個對象你就可以靈活地做很多事情,比如:讀寫對象的變數,甚至調用對象的函數。

讓組件做到局部刷新setNativeProps 
有時候我們需要直接改動組件並觸發局部的刷新,但不使用state或是props。 
setNativeProps 方法可以理解為web的直接修改dom。使用該方法修改 View 、 Text 等 RN自帶的組件 ,則不會觸發組件的 componentWillReceiveProps 、 shouldComponentUpdate 、componentWillUpdate 等組件生命周期中的方法。

'use strict'

import React, { Component } from 'react';

import  {
    AppRegistry,
    StyleSheet,
    Text,
    View,
    TextInput
} from 'react-native';


import Dimensions from 'Dimensions';
// 屏幕寬度
var screenWidth = Dimensions.get('window').width;
class RNRefDetail extends Component {
    // 構造
    constructor(props) {
        super(props);
        // 初始狀態
        this.state = {
            textInputValue: ''
        };
         this.buttonPressed = this.buttonPressed.bind(this);
    }

    buttonPressed() { //當按鈕按下的時候執行此函數
        let textInputValue = 'yuanmenglong';

        this.setState({textInputValue});

        //修改文本輸入框的屬性值
        this.refs.textInputRefer.setNativeProps({
            editable:false
        });

        this.refs.text2.setNativeProps({
            style:{
                color:'blue',
                fontSize:30
            }
        });
        //使文本輸入框變為不可編輯
    }

    render() {
        return (
            //ref={'text2'}>   //指定本組件的引用名
            <View style={styles.container}>
                <Text style={styles.buttonStyle} onPress={this.buttonPressed}>
                    按我
                </Text>
                <Text style={styles.textPromptStyle} ref="text2">
                    文字提示
                </Text>
                <View>
                    <TextInput style={styles.textInputStyle}
                               ref="textInputRefer"
                               value={this.state.textInputValue}
                               onChangeText={(textInputValue)=>this.setState({textInputValue})}
                    />
                </View>
            </View>
        );
    }
}

const styles = StyleSheet.create({
    container: {
        flex: 1,
        justifyContent: 'center',
        alignItems: 'center'
    },
    buttonStyle: { //文本組件樣式,定義簡單的按鈕
        fontSize: 20,
        backgroundColor: 'grey'
    },
    textPromptStyle: { //文本組件樣式
        fontSize: 20
    },
    textInputStyle: { //文本輸入組件樣式
        width: 150,
        height: 50,
        fontSize: 20,
        backgroundColor: 'grey'
    }
});

module.exports = RNRefDetail;
當點擊按鈕時,會刷新3個控制項的值,但是只是單獨去改變,而不是通過改變state狀態機的機制來刷新界面,在重覆需要多次刷新時使用,普通的時候直接通過state改變即可。 
這樣用的缺點就是局部改變,回導致狀態機混亂。

在用Reactnative寫工程時,預設奇妙的有一種像OC中,或者Java 中或者當前類的私有屬性的想法,state 和props都不能滿足時,就是ref  

它能達到其他語言中持有一個view組件,並且局部的刷新

ref 接受值為string類型的參數或者一個函數function

callback。這一特性讓開發者對ref的使用更加靈活。
render() {
    return <TextInput ref={(c) => this._input = c} />;
  },
  componentDidMount() {
    this._input.focus();
  },
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
render(){
    return <View ref={ (e) => this._view = e } />//將組件view作為參數賦值給了this._view
}
componentDidMount(){
    this._view.style = { backgroundColor:'red',width:100,height:200 }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

需要提醒大家的是,只有在組件的render方法被調用時,ref才會被調用,組件才會返回ref。如果你在調用this.refs.xx時render方法還沒被調用,那麼你得到的是undefined。 
心得:ref屬性在開發中使用頻率很高,使用它你可以獲取到任何你想要獲取的組件的對象,有個這個對象你就可以靈活地做很多事情,比如:讀寫對象的變數,甚至調用對象的函數。

讓組件做到局部刷新setNativeProps 
有時候我們需要直接改動組件並觸發局部的刷新,但不使用state或是props。 
setNativeProps 方法可以理解為web的直接修改dom。使用該方法修改 View 、 Text 等 RN自帶的組件 ,則不會觸發組件的 componentWillReceiveProps 、 shouldComponentUpdate 、componentWillUpdate 等組件生命周期中的方法。

'use strict'
import React, { Component } from 'react';

import  {
    AppRegistry,
    StyleSheet,
    Text,
    View,
    TextInput
} from 'react-native';


import Dimensions from 'Dimensions';
// 屏幕寬度
var screenWidth = Dimensions.get('window').width;
class RNRefDetail extends Component {
    // 構造
constructor(props) {
        super(props);
        // 初始狀態
this.state = {
            textInputValue: ''
};
         this.buttonPressed = this.buttonPressed.bind(this);
    }

    buttonPressed() { //當按鈕按下的時候執行此函數
let textInputValue = 'yuanmenglong';

        this.setState({textInputValue});

        //修改文本輸入框的屬性值
this.refs.textInputRefer.setNativeProps({
            editable:false
});

        this.refs.text2.setNativeProps({
            style:{
                color:'blue',
                fontSize:30
}
        });
        //使文本輸入框變為不可編輯
}

    render() {
        return (
            //ref={'text2'}>   //指定本組件的引用名
<View style={styles.container}>
                <Text style={styles.buttonStyle} onPress={this.buttonPressed}>
                    按我
</Text>
                <Text style={styles.textPromptStyle} ref="text2">
                    文字提示
</Text>
                <View>
                    <TextInput style={styles.textInputStyle}
                               ref="textInputRefer"
value={this.state.textInputValue}
                               onChangeText={(textInputValue)=>this.setState({textInputValue})}
                    />
                </View>
            </View>
        );
    }
}

const styles = StyleSheet.create({
    container: {
        flex: 1,
        justifyContent: 'center',
        alignItems: 'center'
},
    buttonStyle: { //文本組件樣式,定義簡單的按鈕
fontSize: 20,
        backgroundColor: 'grey'
},
    textPromptStyle: { //文本組件樣式
fontSize: 20
},
    textInputStyle: { //文本輸入組件樣式
width: 150,
        height: 50,
        fontSize: 20,
        backgroundColor: 'grey'
}
});

module.exports = RNRefDetail;
  • 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
  • 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

當點擊按鈕時,會刷新3個控制項的值,但是只是單獨去改變,而不是通過改變state狀態機的機制來刷新界面,在重覆需要多次刷新時使用,普通的時候直接通過state改變即可。 
這樣用的缺點就是局部改變,回導致狀態機混亂。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • function ajax(data){ //data{data:"",dataType:"xml/json",type:"get/post",url:"",asyn:"true/false",success:funtion(){},failure:function(){}} //datapost=... ...
  • 原型 每個函數都有一個prototype屬性,指向一個原型對象,這個對象專門保存特定類型的所有實例【共有的屬性和方法】。 所有原型對象都會自動獲得constructor屬性,指向構造函數。 在調用構造函數創建新實例對象時,會自動設置新實例的內部屬性[[Prototype]]指向構造函數的原型對象。 ...
  • HTML * Doctype作用?嚴格模式與混雜模式如何區分?它們有何意義? 1.<!DOCTYPE> 聲明位於文檔中的最前面的位置,處於 <html> 標簽之前。此標簽可告知瀏覽器文檔使用哪種 HTML 或 XHTML 規範 2. 所謂的標準模式是指,瀏覽器按 W3C 標準解析執行代碼;怪異模式則 ...
  • 1.SyntaxError(語法錯誤) 解析代碼時發生的語法錯誤 eg:var 1a; Uncaught SyntaxError: Unexpected number 2.ReferenceError(引用錯誤) a.引用了一個不存在的變數 eg: console.log(a); Uncaught ...
  • js中立即執行函數的應用:應用到事件綁定上。 少說多做,直接運行代碼(代碼中有註釋): 運行結果: 當點擊id為a1,a2,a3的div時分別觸發對應的事件。 ...
  • 感謝 LeaVerou 大神,讓我們可以提前使用上這麼美妙的屬性。 conic-gradient 是個什麼?說到 conic-gradient ,就不得不提的它的另外兩個兄弟: linear-gradient : 線性漸變 radial-gradient : 徑向漸變 說這兩個應該還是有很多人瞭解並 ...
  • 一.首先我們總結下行內元素和塊級元素有哪些: 行內元素: <a>標簽可定義錨<abbr>表示一個縮寫形式<acronym>定義只取首字母縮寫<b>字體加粗<bdo>可覆蓋預設的文本方向<big>大號字體加粗<br>換行<cite>引用進行定義<code>定義電腦代碼文本<dfn>定義一個定義項目< ...
  • 求出字元串中位的字元(charAt()方法、substr()方法)、刪除字元串中重覆的字元並輸出(push()方法、call()方法、filter()方法)。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...