首页 文章

React-Native将Textinputvalue传递给其他js

提问于
浏览
0

我是一个非常新手的反应本地人,所以这样的问题 .

我必须实现一个应用程序,我可以登录我们的网站 . 稍后详细介绍 .

First problem: 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/ontrack-logo@3x.png')
      }
      />
        </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中输入名称和密码 .

Than

LoginButton.js

'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);

Than

./action/login.js中的dispatch(logInToWeb)方法如下所示:

'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};

So the Question is:

如何将ButtonClick上的LoginScreen.js中的Textinput值传递给login.js中的logInToWeb-Method

如何在login.js中调用的警报中获取名称和密码

而已 . 稍后我会问更多关于bearer-auth和loggin到服务器:)

1 回答

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

相关问题