2016-09-27 17 views
0

私はネイティブに反応する非常に初心者なので、この種の質問にはうってつけです。React-Native pass他のjsへのTextinputvalue

私は私たちのウェブサイトにログインできるアプリを実装する必要があります。詳細は後で。

まず問題: LoginScreen.js

var Animated = require('Animated'); 
 
var Dimensions = require('Dimensions'); 
 
var Image = require('Image'); 
 
var React = require('React'); 
 
var StatusBar = require('StatusBar'); 
 
var StyleSheet = require('StyleSheet'); 
 
var View = require('View'); 
 
var { 
 
    Text 
 
} = require('OnTrackText'); 
 
var LoginButton = require('../common/LoginButton'); 
 
var TouchableOpacity = require('TouchableOpacity'); 
 
var TextInput = require('TextInput'); 
 
var { 
 
    skipLogin 
 
} = require('../actions'); 
 
var { 
 
    connect 
 
} = require('react-redux'); 
 
class LoginScreen extends React.Component { 
 
    state = { 
 
    anim: new Animated.Value(0), 
 
    name: '', 
 
    password: '' 
 
    }; 
 
    componentDidMount() { 
 
    Animated.timing(this.state.anim, { 
 
     toValue: 3000, 
 
     duration: 3000 
 
    }).start(); 
 
    } 
 
    render() { 
 
    return (< Image style = { 
 
     styles.container 
 
     } 
 
     source = { 
 
     require('./img/login-background.png') 
 
     } > 
 
     < StatusBar barStyle = "default"/> 
 
     < TouchableOpacity accessibilityLabel = "Skip login" 
 
     accessibilityTraits = "button" 
 
     style = { 
 
     styles.skip 
 
     } 
 
     onPress = { 
 
     () => this.props.dispatch(skipLogin()) 
 
     } > 
 
     < Animated.Image style = { 
 
     this.fadeIn(2800) 
 
     } 
 
     source = { 
 
     require('./img/x.png') 
 
     } 
 
     /> 
 
     </TouchableOpacity > 
 
     < View style = { 
 
     styles.section 
 
     } > 
 
     < Animated.Image style = { 
 
     this.fadeIn(0) 
 
     } 
 
     source = { 
 
     require('./img/[email protected]') 
 
     } 
 
     /> 
 
     </View > 
 
     < View style = { 
 
     styles.section 
 
     } > 
 
     < Animated.Text style = { 
 
     [styles.h1, this.fadeIn(700, -20)] 
 
     } > 
 
     Willkommen zur < /Animated.Text> 
 
      <Animated.Text style={[styles.h1, {marginTop: -10}, this.fadeIn(700, 20)]}> 
 
      OnTrack App 
 
      </Animated.Text > 
 
     < /View> 
 
     <View style={styles.section}> 
 
      <TextInput 
 
      style={styles.input} 
 
      onChangeText={(text) => this.setState({ name: text }) } 
 
      value={this.state.name} 
 
      placeholder={"Benutzername"} 
 
      /> 
 
     < TextInput style = { 
 
     styles.input 
 
     } 
 
     onChangeText = { 
 
     (text) => this.setState({ 
 
      password: text 
 
     }) 
 
     } 
 
     value = { 
 
     this.state.password 
 
     } 
 
     secureTextEntry = { 
 
     true 
 
     } 
 
     placeholder = { 
 
     "Password" 
 
     } 
 
     /> 
 
     </View > 
 
     < Animated.View style = { 
 
     [styles.section, styles.last, this.fadeIn(2500, 20)] 
 
     } > 
 
     < LoginButton name = { 
 
     this.state.name 
 
     } 
 
     password = { 
 
     this.state.password 
 
     } 
 
     source = "First screen"/> 
 
     < /Animated.View> 
 
     </Image > 
 
    ); 
 
    } 
 
    fadeIn(delay, from = 0) { 
 
    .... 
 
    } 
 
    const scale = Dimensions.get('window').width/375; 
 
    var styles = StyleSheet.create({ 
 
     .... 
 
    } 
 
    }); 
 
module.exports = connect()(LoginScreen);

あなたは私がTextInputコントロールに名前とパスワードを入力したいと思います見ることができるように。

より

LoginButton.js ./action/login.jsルックスで

ディスパッチ(logInToWeb)法より

'use strict'; 
 

 
const React = require('react'); 
 
const {StyleSheet} = require('react-native'); 
 

 
const { logInToWeb } = require('../actions'); 
 
const {connect} = require('react-redux'); 
 

 
class LoginButton extends React.Component { 
 
    props: { 
 
    style: any; 
 
    source?: string; // For Analytics 
 
    dispatch: (action: any) => Promise; 
 
    onLoggedIn: ?() => void; 
 
    }; 
 
    state: { 
 
    isLoading: boolean; 
 
    }; 
 
    _isMounted: boolean; 
 

 
    constructor() { 
 
    super(); 
 
    this.state = { isLoading: false }; 
 
    } 
 

 
    componentDidMount() { 
 
    this._isMounted = true; 
 
    } 
 

 
    componentWillUnmount() { 
 
    this._isMounted = false; 
 
    } 
 

 
    render() { 
 
    if (this.state.isLoading) { 
 
     return (
 
     <OnTrackButton 
 
      style={[styles.button, this.props.style]} 
 
      caption="Please wait..." 
 
      onPress={() => {}} 
 
     /> 
 
    ); 
 
    } 
 

 
    return (
 
     <OnTrackButton 
 
     style={[styles.button, this.props.style]} 
 
    // icon={require('../login/img/f-logo.png')} 
 
     caption="Login to OnTrack" 
 

 
     // onPress={this.props.onpress} 
 
     onPress={() => this.logIn()} 
 
     /> 
 
    ); 
 
    } 
 

 
    async logIn() { 
 
    const {dispatch, onLoggedIn, name, password} = this.props; 
 

 
    this.setState({isLoading: true}); 
 
    try { 
 
     await Promise.race([ 
 
     dispatch(logInToWeb(name,password)), 
 
     timeout(15000), 
 
     ]); 
 
    } catch (e) { 
 
     const message = e.message || e; 
 
     if (message !== 'Timed out' && message !== 'Canceled by user') { 
 
     alert(message); 
 
     console.warn(e); 
 
     } 
 
     return; 
 
    } finally { 
 
     this._isMounted && this.setState({isLoading: false}); 
 
    } 
 

 
    onLoggedIn && onLoggedIn(); 
 
    } 
 
} 
 

 
async function timeout(ms: number): Promise { 
 
    return new Promise((resolve, reject) => { 
 
    setTimeout(() => reject(new Error('Timed out')), ms); 
 
    }); 
 
} 
 

 
var styles = StyleSheet.create({ 
 
... 
 
}); 
 

 
module.exports = connect()(LoginButton);

このように:

'use strict'; 
 

 
import type { Action, ThunkAction } from './types'; 
 

 
const Parse = require('parse/react-native'); 
 
const {Platform} = require('react-native'); 
 
const Alert = require('Alert'); 
 

 

 
function logInToWeb(data): ThunkAction { 
 
    const {name, password} = data 
 

 
     Alert.alert(
 
     `Hi, ${name} & ${password}`, 
 
     'möchten Sie sich ausloggen?', 
 
     [ 
 
      { text: 'Abbruch' }, 
 
      { text: 'Ausloggen' }, 
 
     ] 
 
    ) 
 
    
 
} 
 

 
function skipLogin(): Action { 
 
    return { 
 
    type: 'SKIPPED_LOGIN', 
 
    }; 
 
} 
 

 
function logOut(): ThunkAction { 
 
... 
 
} 
 

 
function logOutWithPrompt(): ThunkAction { 
 
.... 
 
} 
 

 
module.exports = {logInToWeb, skipLogin, logOut, logOutWithPrompt};

そこで質問です:

は、どのように私はlogin.jsでlogInToWeb-方法にButtonClick上LoginScreen.jsからのTextInputの値を渡すことができます

login.jsで呼び出されたアラートで、名前とパスワードを取得する方法

それはそうです。後で私はベアラの認証とサーバへのログインについてもっとお尋ねします:)

+0

は 'LoginButton'で' onPress'方法/機能writterですか? –

+0

はいLogIn()メソッドがLoginButtonにあります – Vitja

答えて

0

私はあなたのlogIn()メソッドに名前とパスワードを送信する方法を聞いていると思いますか?たぶん、このような何かが働くだろう:

// Login Button 
<LoginButton 
    name={this.state.name} 
    password={this.state.password} 
    source="First screen" /> 

// Login method 
async logIn() { 
    const {dispatch, onLoggedIn, name, password} = this.props; 
    this.setState({isLoading: true}); 
    try { 
    await Promise.race([ 
     dispatch(logInToWebk({name, password})), 
     timeout(15000), 
    ]); 
    } 
} 

を、その後

function logInToWebk(data): ThunkAction { 
    const { name, password } = data 
    // do something with name + password 
} 
+0

名前とパスワードが渡されたかどうかを調べるために、logintoweb()の名前とパスワードのプロパティを警告しました...しかし、それは未定義です。 – Vitja

+0

コンポーネントのすべてのコードを表示しますか? –

+0

どのコンポーネントが必要ですか?私はloginscreen、loginとloginbuttonのすべてのコードを投稿する必要がありますか? – Vitja

関連する問題