app实现页面跳转 react

2020-01-14 10:10:47 qq_42813491 阅读数 1229

react--js实现界面跳转

  • 学习资源推荐:https://blog.csdn.net/qq_42813491/article/details/90213353

引包

import { Redirect } from "react-router-dom";

使用

 <Redirect to="/home"/>

demo

  • Login.js
import React from 'react'
import { Redirect } from "react-router-dom";

class Login extends React.Component {

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

    doLogin=()=>{
        let username=document.querySelector("input[type=text]").value;
        let password=document.querySelector("input[type=password]").value;
        if(username==="admin"&&password==="123456"){
            this.setState({
                login :true
            })
        }
    }

    
   
    render() {
        if(this.state.login){
           return  <Redirect to="/home"/>
        }else{
            alert("登录失败");
        }
        return (
            <div>

                <form onSubmit={this.doLogin}>
                    账号:<input type="text"/><br/>
                    密码:<input type="password"/><br/>
                    <input type="submit" value="登录"/>
                </form>
             
            </div>

        );
    }
}

export default Login;
  • App.js
import React from 'react';
import { BrowserRouter as Router, Route } from "react-router-dom";
import Login from './components/Login'
import Home from './components/Home'

class App extends React.Component {
  render() {

    return (
      <Router>
        <Route exact path="/" component={Login}  />
        <Route  path="/home" component={Home}  />
      </Router>
    );
  }
}

export default App;

  • Home.js
import React from 'react'
class Home extends React.Component {
    constructor(props) {
        super(props);
        this.state = {  };
    }
    render() {
        return (
            <h1>这里是首页</h1>
        );
    }
}

export default Home;

效果图

在这里插入图片描述

  • 账号密码正确
    在这里插入图片描述
  • 账号或密码错误
    在这里插入图片描述
2017-11-17 10:10:02 beyond181 阅读数 2895

先来吐槽一下,React native学习的资料真的是很少啊,而且国内博客大部分都很老,还千篇一律,加了几个群,光有问的,没有回答的。简直了。。。难过

好了,现在来说一说怎么跳转到React native的某个页面:

React native现在提倡大家用React Navigation 来做导航器,如果不懂得,先去官网看看例子。这里页面跳转用StackNavigator,以下是示例代码:

 

const App = StackNavigator({
    first: {
        screen: First,
        path:'app/first'
    },
    second: {
        screen: Second,
        path:'app/second'},
}, {
    navigationOptions: {
        header: null
    },
});

大家可能知道screen,它就是要跳转的页面,但是对path可能不太清楚,下面是官网的介绍,当deep linking或者是一个web app的时候,这个就有用处了,所以今天app跳转原生就是由path来实现了。

 

 

android/app/src/main/AndroidManifest.xml中的MainActivity 下添加

<intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
    <data android:scheme="demo2"
          android:host="demo2" />
</intent-filter>

 

然后通过在原生app处调用

Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
Uri uri = Uri.parse("demo2://demo2/app/first");
intent.setData(uri);
startActivity(intent);

就可以打开了,同样,如果有参数的话,首先path定义的时候要定义'app/first/:name',

然后调用的时候Uri uri = Uri.parse("demo2://demo2/app/first/rou");//first后边的就是参数

后记:

之前按照此方法是可行的,可是最近有很多人问我,怎么跳转不了了,我自己也试了一下,确实不可以了!需要在StackNavigator中增加一个URI的匹配项,代码如下:

 

import React, { Component } from 'react';
import {
    StackNavigator,
} from 'react-navigation';
import Third from './page/third'
import First from './page/first'
import Second from './page/second'
const App = StackNavigator({
    first: {
        screen: First,
        path:'app/first'
    },
    second: {
        screen: Second,
        path:'app/second'
    },
    third:{
        screen: Third,
        path:'app/third'
    },
}, {
    navigationOptions: {
        header: null
    },
});
const prefix = 'demo2://demo2/';
const MainApp = () => <App uriPrefix={prefix} />

export default MainApp ;

现在就可以跳转了!

 

 

2019-05-15 15:43:41 guolinghang 阅读数 614

###React Web:使用Router实现页面跳转、传参

####1.效果展示
这里写图片描述

####2 . npm导入react-router并添加依赖
(shift+右键项目根目录,打开命令行输入以下内容)

npm install react-router --save-dev

####3.新建两个子页面
Red.js

import ReactDOM,{render} from 'react-dom'

export default class Red extends Component{
  render(){
    return <div>Red</div>
  }
}

####4.Router实现
Index.js

import React,{Component} from 'react'
import ReactDOM,{render} from 'react-dom'
import { Router, Route, hashHistory,Link } from 'react-router';

import Red from './Red'
import Blue from './Blue'

class MyApp extends Component{
  render(){
    return(
      <div>
        <h3>This is index(MyApp)</h3>
        <Link to="/red"><h3>toRed</h3></Link>
        <Link to={"/blue/"+20}><h3>toBlue</h3></Link>
      </div>
    );
  }
}

render((
  <Router history={hashHistory}>
    <Route path="/" component={MyApp}/>
    <Route path="/red" component={Red}/>
    <Route path="/blue/:id" component={Blue}/>
  </Router>
), document.getElementById('app'));

6.添加<Link>标签

react的<Link>标签在浏览器上会被渲染为<a>标签

<Link to="/red"><h3>toRed</h3></Link>

7.传参

在Router内新增一句(id即是要传的参数名)

<Route path="/blue/:id" component={Blue}/>

同样对“toBlue”加上<Link>标签,区别是多了一斜杠和传递值,然后包裹上大括号,

<Link to={"/blue/"+20}><h3>toBlue</h3></Link>

8.接受参数

Blue.js

import ReactDOM,{render} from 'react-dom'

export default class Blue extends Component{
  constructor(props){
    super(props);
  }
  render(){
    return <div>Blue:id:{this.props.params.id}</div>
  };
}
2018-05-06 16:58:22 qq_41915690 阅读数 4275

使用navigation时需要在项目中输入npm install --save react-navigation或者yarn add react-navigation

如图:注意是在项目内的控制台输入。输入后才能正确只能提醒并使用(如果已经安装yarn,建议使用yarn add react-navigation   因为这个速度快)

注:使用前必须import引入!

import {
    StackNavigator
}from 'react-navigation';

 

------------------------------------分割线----------------------------------------------

 

使用StackNavigator时设置页面的标题

代码如下:

 static navigationOptions = {    //上标题
        title: '页面一',
    };

 

----------------------------------分割线---------------------------------

接下来来一个精简版的实例,能直接运行。

// App.js
import React, {Component} from 'react';
import ChoosePage from './src/choosePage';

type Props = {};
export default class App extends Component<Props> {
    render() {
        return (
            <ChoosePage/>

        );
    }
}
// choosePage.js
import React, {Component} from 'react';
import page1 from './page1';
import page2 from './page2';
import {
    StackNavigator
} from 'react-navigation';

export default class choosePage extends Component {

    render() {
        return (
            <MyNavigator/>
        );
    }
}
const MyNavigator = StackNavigator({
    p1: {screen: page1},
    p2: {screen: page2},
}, {
    initialRouteName: 'p1',
});
// page1.js
import React, {Component} from 'react';
import {
    Text,
    View,
    TouchableOpacity
} from 'react-native';

export default class page1 extends Component<Props> {
    static navigationOptions = {    //上标题
        title: '第一页',
    };

    render() {
        const {navigate} = this.props.navigation;
        return (
            <View>
                <TouchableOpacity
                    onPress={() => {
                        navigate('p2');
                    }}>
                    <Text>点我去第二页!</Text>
                </TouchableOpacity>


            </View>
        );
    }
}
// page2.js
import React, {Component} from 'react';
import {
    Text,
    View,
    TouchableOpacity
} from 'react-native';

export default class page2 extends Component<Props> {
    static navigationOptions = {    //上标题
        title: '第二页',
    };

    render() {
        return (
            <View>
                <Text>欢迎来到第二页!</Text>
                <TouchableOpacity onPress={() => {
                    this.props.navigation.goBack()
                }}
                >
                    <Text>
                        点我返回
                    </Text>
                </TouchableOpacity>
            </View>

        );
    }
}

效果图

一个跳转页面完成了!

 

附:

规范化文件布局:https://blog.csdn.net/qq_41915690/article/details/80216039

运行项目简易方法:https://blog.csdn.net/qq_41915690/article/details/80155372

初次运行项目会遇到的问题解决方法:https://blog.csdn.net/qq_41915690/article/details/80289475

跨界面数据传输功能源代码:https://blog.csdn.net/qq_41915690/article/details/80294473

 

2020-01-09 12:25:40 weixin_38824257 阅读数 2369

React-Native集成到现有的安卓项目请移步:

链接: https://blog.csdn.net/major_zhang/article/details/84645352

1.创建react-native项目

因为react-native更新得很快,使用react-native init命令创建项目会默认使用最新的react-native版本,这也导致了与之前一些api的不兼容。
我们可以使用下面的命令指定使用的react-native版本:

 react-native init demo --verbose --version 0.57.7

2.原生页面跳转到react-native页面

使用android studio导入项目下的android子目录。由于使用命令react-native run-android默认会启动MainActivity作为第一个页面并且现在MainActivity会默认加载react-native页面,这里我们是想从MainActivity跳转到react-native页面。所以要改写一下MainActivity:
在MainActivity中添加两个按钮,一个跳转到react-native的主页面,另一个跳转到react-native的子页面。

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_rn);


        findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                startActivity(new Intent(MainActivity.this,RNActivity.class));
            }
        });

        findViewById(R.id.btn_test).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                startActivity(new Intent(MainActivity.this,TestActivity.class));
            }
        });
    }
}

然后我们创建RNActivity用于承载react-native的主页面,注意在getMainComponentName方法中返回的字符串就是在react-native中注册的组件名字。

public class RNActivity extends ReactActivity {

    /**
     * Returns the name of the main component registered from JavaScript.
     * This is used to schedule rendering of the component.
     */
    @Override
    protected String getMainComponentName() {
        return "application";
    }
}

在react-native注册的组件定义如下:AppRegistry.registerComponent方法的第一个参数是组件的名字,第二个参数是需要显示的组件。这里第二个参数我们使用了导航组件react-navigator来显示。

项目的index.js

import React, { Component } from 'react';
import { Text, AppRegistry } from 'react-native';
import {AppStackNavigator} from "./src/navigator/AppNavigator"

AppRegistry.registerComponent('application', () => AppStackNavigator);

然后使用命令react-native run-android将项目运行起来。
在这里插入图片描述

3.react-native页面跳转到原生页面

需要从react-native页面跳转到原生页面步实现方法是这样的:首先,在原生中创建一个继承ReactContextBaseJavaModule的类,重写getName方法并且添加一个供react-native调用的方法,该方法就是用于页面跳转。然后,创建一个继承ReactPackage的类,将继承于ReactContextBaseJavaModule的类的实列添加进去。最后,在MainApplication的getPackages方法中,添加继承于ReactPackage的类的实例。
代码如下:

MyIntentModule

package com.demo;

import android.app.Activity;
import android.content.Intent;
import android.text.TextUtils;

import com.facebook.react.bridge.Callback;
import com.facebook.react.bridge.JSApplicationIllegalArgumentException;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;

public class MyIntentModule extends ReactContextBaseJavaModule {
    public MyIntentModule(ReactApplicationContext reactContext) {
        super(reactContext);
    }

    @Override
    public String getName() {
        return "IntentMoudle";//这里定义的是该模块名字
    }
   

    @ReactMethod
    public void startActivityFromJS(String name, String params){//该模块的方法
        try{
            Activity currentActivity = getCurrentActivity();
            if(null!=currentActivity){
                Class toActivity = Class.forName("com.demo."+name);
                Intent intent = new Intent(currentActivity,toActivity);
                intent.putExtra("params", params);
                currentActivity.startActivity(intent);
            }
        }catch(Exception e){
            throw new JSApplicationIllegalArgumentException(
                    "不能打开Activity : "+e.getMessage());
        }
    }

    @ReactMethod
    public void dataToJS(Callback successBack, Callback errorBack){
        try{
            Activity currentActivity = getCurrentActivity();
            String result = currentActivity.getIntent().getStringExtra("data");
            if (TextUtils.isEmpty(result)){
                result = "没有数据";
            }
            successBack.invoke(result);
        }catch (Exception e){
            errorBack.invoke(e.getMessage());
        }
    }
}

MyReactPackage

package com.demo;


import com.facebook.react.ReactPackage;
import com.facebook.react.bridge.NativeModule;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.uimanager.ViewManager;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class MyReactPackage implements ReactPackage {
    @Override
    public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
        return Arrays.<NativeModule>asList(new MyIntentModule(reactContext));
    }
    @Override
    public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
        return Collections.emptyList();
    }
}

MainApplication 
```java

package com.demo;

import android.app.Application;

import com.facebook.react.ReactApplication;
import org.devio.rn.splashscreen.SplashScreenReactPackage;
import com.facebook.react.ReactNativeHost;
import com.facebook.react.ReactPackage;
import com.facebook.react.shell.MainReactPackage;
import com.facebook.soloader.SoLoader;

import java.util.Arrays;
import java.util.List;

public class MainApplication extends Application implements ReactApplication {

  private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) {
    @Override
    public boolean getUseDeveloperSupport() {
      return BuildConfig.DEBUG;
    }

    @Override
    protected List<ReactPackage> getPackages() {
      return Arrays.<ReactPackage>asList(
          new MainReactPackage(),
            new SplashScreenReactPackage(),
              new MyReactPackage()//将MyReactPackage实例添加进来
      );
    }

    @Override
    protected String getJSMainModuleName() {
      return "index";
    }
  };

  @Override
  public ReactNativeHost getReactNativeHost() {
    return mReactNativeHost;
  }

  @Override
  public void onCreate() {
    super.onCreate();
    SoLoader.init(this, /* native exopackage */ false);
  }
}

在react-native中调用,这个界面我写的示例比较多。其实使用起来很简单,先引入NativeModules,添加一个按钮,点击调用jumpNative方法。在方法中调用在原生定义的方法:NativeModules.IntentMoudle.startActivityFromJS(“MainActivity”, null);

/**
 * Sample React Native App
 * https://github.com/facebook/react-native
 *
 * @format
 * @flow
 */

import React, {Component} from 'react';
import {
    AsyncStorage,
    StyleSheet,
    Image,
    View,
    Text,
    TouchableOpacity,
    ActivityIndicator,
    DrawerLayoutAndroid,
    NativeModules,//引入的模块

} from 'react-native';



export default class Home extends Component {


    jumpNative(){
        //调用原生方法
        NativeModules.IntentMoudle.startActivityFromJS("MainActivity", null);
    }

    render() {
        const {navigation} = this.props;

        return (
            <View>
                <View style={styles.container}>

                    <TouchableOpacity style={styles.bt} activeOpacity={0.5}
                                      onPress={() => {
                                          navigation.navigate('TestPage');
                                      }}>
                        <Text style={styles.bt_text}>
                            注册的子页面
                        </Text>
                    </TouchableOpacity>
                    <TouchableOpacity style={styles.bt} activeOpacity={0.5}
                                      onPress={() => {
                                          this.jumpNative();
                                      }}>
                        <Text style={styles.bt_text}>
                            跳转到原生页面
                        </Text>
                    </TouchableOpacity>


                    <TouchableOpacity style={styles.bt} activeOpacity={0.5}
                                      onPress={() => {
                                          navigation.navigate('Page1', {name: '动态的title'});
                                      }}>
                        <Text style={styles.bt_text}>
                            页面跳转
                        </Text>
                    </TouchableOpacity>

                    <TouchableOpacity style={styles.bt} activeOpacity={0.5}
                                      onPress={() => {
                                          navigation.navigate('FlatListPage');
                                      }}>
                        <Text style={styles.bt_text}>
                            列表页面
                        </Text>
                    </TouchableOpacity>

                    <TouchableOpacity style={styles.bt} activeOpacity={0.5}
                                      onPress={() => {
                                          navigation.navigate('KeyboardAvoidingViewPage');
                                      }}>
                        <Text style={styles.bt_text}>
                            键盘弹起自动伸缩
                        </Text>
                    </TouchableOpacity>
                    <TouchableOpacity style={styles.bt} activeOpacity={0.5}
                                      onPress={() => {
                                          navigation.navigate('SomeComponent');
                                      }}>
                        <Text style={styles.bt_text}>
                            一些组件
                        </Text>
                    </TouchableOpacity>
                    <TouchableOpacity style={styles.bt} activeOpacity={0.5}
                                      onPress={() => {
                                          navigation.navigate('TextPage');
                                      }}>
                        <Text style={styles.bt_text}>
                            文本标签
                        </Text>
                    </TouchableOpacity>
                    <TouchableOpacity style={styles.bt} activeOpacity={0.5}
                                      onPress={() => {
                                          navigation.navigate('TouchablePage');
                                      }}>
                        <Text style={styles.bt_text}>
                            Touchable
                        </Text>
                    </TouchableOpacity>

                    <TouchableOpacity style={styles.bt} activeOpacity={0.5}
                                      onPress={() => {
                                          navigation.navigate('HookPage');
                                      }}>
                        <Text style={styles.bt_text}>
                            生命周期
                        </Text>
                    </TouchableOpacity>

                    <TouchableOpacity style={styles.bt} activeOpacity={0.5}
                                      onPress={() => {
                                          navigation.navigate('PlaceAnOrder');
                                      }}>
                        <Text style={styles.bt_text}>
                            包车物流
                        </Text>
                    </TouchableOpacity>

                    <TouchableOpacity style={styles.bt} activeOpacity={0.5}
                                      onPress={() => {
                                          navigation.navigate('Component11');
                                      }}>
                        <Text style={styles.bt_text}>
                            时间选择器
                        </Text>
                    </TouchableOpacity>

                    <ActivityIndicator size="large" color="#0000ff"/>

                    <View style={styles.container}>
                        <Image
                            style={{width: 180, height: 180}}
                            source={{uri: 'http://wx4.sinaimg.cn/bmiddle/78b88159gy1g8ryut3tdrg208l08lkgn.gif'}}
                        />
                        <Image
                            style={{width: 180, height: 180}}
                            source={{uri: 'http://wx3.sinaimg.cn/bmiddle/006GJQvhly1g7qk0w0kyrg307e07e1hs.gif'}}
                        />
                    </View>
                </View>

            </View>
        );
    }
}

const styles = StyleSheet.create({
    container: {
        alignItems: 'center',
        flexDirection: 'row',
        flexWrap: 'wrap'
    },
    bt: {
        width: 180,
        height: 50,
        backgroundColor: '#0af',
        justifyContent: 'center',
        alignItems: 'center',
        borderRadius: 5,
        marginLeft: 5,
        marginTop: 5,
    },
    bt_text: {
        color: '#fff',
    }
});


然后使用命令react-native run-android将项目运行起来。
在这里插入图片描述
完整的项目demo:

https://github.com/githubchl/ReactNativeDemo

注意,运行项目前。先npm install下载好项目依赖。然后打开android studio导入android目录下载好依赖,再使用react-native run-android运行项目。如果这篇博客确实帮助到你了,麻烦到github点个star。