mobx與自定義彈框組件(Dialog)的結(jié)合

在開始寫彈框之前恭取,需要確定實(shí)現(xiàn)以下效果:


效果圖

效果需求:
1.點(diǎn)擊請(qǐng)點(diǎn)擊彈出彈框。
2.彈框的頭部耗跛、中間內(nèi)容、選項(xiàng)塊的內(nèi)容均為可變的调塌。
3.彈框的大小隨著框內(nèi)內(nèi)容的多少成比例擴(kuò)大晋南。
4.選項(xiàng)塊的數(shù)量也可變负间,暫定最少1個(gè),最多2個(gè)政溃。
5.點(diǎn)擊選項(xiàng)塊后實(shí)現(xiàn)回調(diào)方法态秧,也可不回調(diào)董虱,也可能傳的回調(diào)方法為空愤诱。
6.不能用modal,因?yàn)楫?dāng)兩個(gè)modal同時(shí)出現(xiàn)時(shí)項(xiàng)目會(huì)崩捐友,可用position實(shí)現(xiàn)。
技術(shù)點(diǎn):
1.可利用mobox的觀察者匣砖、也可用setState
2.彈框?yàn)榉庋b好的組件,父組件中不可再使用state控制彈框的出現(xiàn)與否脆粥,而需要在彈框組件內(nèi)部暴露出一個(gè)修改彈框內(nèi)容state的函數(shù)砌溺,父組件用ref調(diào)用规伐。
3.當(dāng)子組件中使用了inject()方法調(diào)取數(shù)據(jù)時(shí)匣缘,注意this.refs.子組件ref值.子組件函數(shù)是會(huì)報(bào)錯(cuò)的猖闪,需要使用this.refs.子組件ref值.wrappedInstance.子組件方法
4.也可以為observable的數(shù)據(jù)與action封裝一個(gè)store培慌,只有調(diào)用它的store后才會(huì)刷新父組件柑爸。
實(shí)現(xiàn)過程:
1.封裝Dialog組件

//Dialog.js
import React, { Component } from 'react';
import {
    StyleSheet,
    View,
    Text,
    Dimensions,
    TouchableOpacity,
} from 'react-native';
const { width, height } = Dimensions.get('window');
import { remove, getPixel } from '..';
import{observer,inject} from 'mobx-react';
import { observable } from 'mobx';
/*eslint-disable*/
//  @inject('rootStore')
@observer
export class Dialog extends Component{

    /**
     * from @marongting Tel 13269798391
     * content 彈窗是否出現(xiàn)控制器
     */
    @observable isFrameShow = false;

    constructor(props){
        super(props);
       
    }
    
    frameShow =() =>{
        this.isFrameShow = !this.isFrameShow;
    }
    render(){
        const {title,content,isCancel,isSubmit,cancel,submit} = this.props;
        return(
            <View style={{
                position:'absolute'}}>
                {
                    this.isFrameShow && 
                    <View style={{width:width,height:height,
                        backgroundColor:'rgba(0,0,0,0.5)',
                        position:'absolute',
                        alignItems:'center',
                        justifyContent:'center'}}>
                        <View style={{
                            borderRadius:getPixel(10),
                            backgroundColor:'#fff'}}>
                            <View style={{
                                alignItems:'center',
                                justifyContent:'center',
                                borderBottomWidth:StyleSheet.hairlineWidth,
                                borderBottomColor:'#cdcdcd',
                               
                            }}>
                                <Text allowFontScaling={false} style={{
                                fontSize:getPixel(18),
                                fontWeight:'bold',
                                lineHeight:getPixel(20),
                                marginHorizontal:getPixel(100),
                                marginTop:getPixel(20)
                            }}>
                            {
                             title ? title : '提示' 
                            }
                            
                            </Text>
                            <Text allowFontScaling={false} style={{
                                fontSize:getPixel(16),
                                lineHeight:getPixel(20),
                                marginVertical:getPixel(15),
                                marginHorizontal:getPixel(20),
                                maxWidth:getPixel(250),
                            }}>
                            {
                                content ? content :'確定要退出登錄?'
                            }
                            
                            </Text>
                            </View>
                            <View style={{
                                flexDirection:'row',
                                }}>
                            {
                                isCancel &&
                                <TouchableOpacity style={{
                                    flex:1,
                                    alignItems:'center',
                                    justifyContent:'center',
                                }} 
                                onPress={
                                    ()=>{
                                        this.isFrameShow = false;
                                        this.props.cancelFunc && this.props.cancelFunc()
                                    }
                                }>
                                <Text style={{
                                    fontSize:getPixel(20),
                                    color:'green',
                                    lineHeight:getPixel(45)
                                }}>
                                {
                                    cancel ? cancel :'取消'
                                }
                                    
                                </Text>
                                </TouchableOpacity>
                            }
                            {
                                isCancel && isSubmit &&
                                <View style={{
                                    width:StyleSheet.hairlineWidth,
                                    height:getPixel(45),
                                    backgroundColor:'#cdcdcd'
                                }}></View>
                            }
                           {
                               isSubmit &&
                               <TouchableOpacity style={{
                                alignItems:'center',
                                justifyContent:'center',
                                flex:1,
                            }} onPress={
                                ()=>{
                                    this.isFrameShow = false;
                                    this.props.submitFunc && this.props.submitFunc();
                                }
                            }>
                            <Text style={{
                                fontSize:getPixel(20),
                                color:'green',
                                lineHeight:getPixel(45)
                            }}>
                            {
                                submit ? submit : '確定' 
                            }
                            </Text>
                            </TouchableOpacity>
                           }
                            
                            </View>
                        </View>
                  </View>
                }
            </View>
           
        )
    }
}

2.調(diào)用封裝的Dialog組件

<TouchableOpacity 
                    style={{marginVertical:100}}
                    onPress={
                        ()=>{
                            /**
                             * from @marongting Tel 13269798391
                             * content 當(dāng)子組件中的數(shù)據(jù)來源于inject時(shí),調(diào)用子組件
                             * 的屬性時(shí)需要使用如下方法:this.refs.子組件ref值
                             * .wrappedInstance.子組件方法
                             */
                            this.refs.Dialog.frameShow()
                        }
                    }>
                    <Text>請(qǐng)點(diǎn)擊</Text>
                </TouchableOpacity>

 <Dialog 
                    ref='Dialog'
                    // title='標(biāo)題'           //彈出框頭部?jī)?nèi)容    
                    // content='不再玩會(huì)嗎'    //彈出框內(nèi)容
                    // cancel='狠心離開'        //彈出框左側(cè)選項(xiàng)內(nèi)容
                    // submit='繼續(xù)'          //彈出框右側(cè)選項(xiàng)內(nèi)容
                    isCancel={true}           //彈出框左側(cè)選項(xiàng)控制器
                    isSubmit={true}            //彈出框右側(cè)選項(xiàng)控制器
                    cancelFunc = {            //彈出框左側(cè)選項(xiàng)回調(diào)方法
                        ()=>{ 
                           
                        }
                    }
                    submitFunc = {              //彈出框右側(cè)選項(xiàng)回調(diào)方法
                        ()=>{
                            console.log('console log for chrom 111',);
                        }
                    }
                    />

心得:

onPress={
this.props.cancelFunc
}

onPress={
()=>{
this.isFrameShow = false;
this.props.cancelFunc();
}
}

的區(qū)分雄坪,维哈,真的是浪費(fèi)了好久..以前寫過,沒整理登澜,記混了。帖渠。
其實(shí)二者效果一樣,只是一個(gè)只調(diào)用了父組件的方法,另外一個(gè)在調(diào)用父組件方法的同時(shí)也調(diào)用了自己的方法..
2.父組件調(diào)用子組件的值切揭、方法:使用refs...
子組件調(diào)用父組件的值、方法:使用this.props....

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末哼审,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子孕豹,更是在濱河造成了極大的恐慌,老刑警劉巖春霍,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件叶眉,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡衅疙,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門喧伞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人潘鲫,你說我怎么就攤上這事〈紊啵” “怎么了?”我有些...
    開封第一講書人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵挪圾,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我逐沙,道長(zhǎng),這世上最難降的妖魔是什么吩案? 我笑而不...
    開封第一講書人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮靠益,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘胧后。我一直安慰自己,他們只是感情好抱环,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著眶痰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪竖伯。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,457評(píng)論 1 311
  • 那天黔夭,我揣著相機(jī)與錄音羽嫡,去河邊找鬼。 笑死婚惫,一個(gè)胖子當(dāng)著我的面吹牛氛赐,可吹牛的內(nèi)容都是我干的先舷。 我是一名探鬼主播,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼牲芋,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼捺球!你這毒婦竟也來了缸浦?” 一聲冷哼從身側(cè)響起裂逐,我...
    開封第一講書人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤泣栈,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后南片,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡铃绒,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年颠悬,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了定血。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赔癌。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖澜沟,靈堂內(nèi)的尸體忽然破棺而出灾票,到底是詐尸還是另有隱情,我是刑警寧澤茫虽,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布刊苍,位于F島的核電站,受9級(jí)特大地震影響濒析,放射性物質(zhì)發(fā)生泄漏正什。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一号杏、第九天 我趴在偏房一處隱蔽的房頂上張望婴氮。 院中可真熱鬧,春花似錦、人聲如沸主经。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽罩驻。三九已至穗酥,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間惠遏,已是汗流浹背砾跃。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留爽哎,地道東北人蜓席。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓厨内,卻偏偏與公主長(zhǎng)得像雏胃,于是被迫代替她去往敵國和親瞭亮。 傳聞我的和親對(duì)象是個(gè)殘疾皇子固棚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

推薦閱讀更多精彩內(nèi)容