2016-09-27 45 views
6

Tôi đang sử dụng các thành phần sau đây để tạo ra một Phản ứng Native + Redux ứng dụng:Tại sao React Native Drawer không được kích hoạt bằng React Native Router Flux + Redux?

tôi đã cố gắng sau chính xác example provided on how to implement the drawer, nhưng khi điều hướng đến nơi ngăn kéo nên được hiển thị, sử dụng Actions.drawer, tôi gặp lỗi:

enter image description here

Nhưng nếu tôi cố điều hướng đến Scene, qua Actions.home, bên trong Scene Drawer, không có gì xảy ra nhưng hành động REACT_NATIVE_ROUTER_FLUX_RESET vẫn đang được gọi qua số redux-logger.

Đã thử theo chính xác ví dụ nhưng không may mắn. Tôi có thể làm gì sai?

Dưới đây là bộ của tôi lên cho cảnh sử dụng Redux:

// @flow 
import React, { Component } from 'react' 
import { 
    ActionConst, 
    Actions, 
    Router, 
    Scene, 
} from 'react-native-router-flux' 
import { 
    Provider, 
    connect, 
} from 'react-redux' 

import configureStore from './store/configureStore' 
import Login from './components/Login' 
import Home from './components/Home' 
import NavDrawer from './components/NavDrawer' 

const RouterWithRedux = connect()(Router) 
const store = configureStore() 

export default class App extends Component { 
    render() { 
    return (
     <Provider store={store}> 
     <RouterWithRedux> 
      <Scene key='root'> 
      <Scene component={Login} initial={true} key='login' title='Login'/> 
      <Scene key="drawer" component={NavDrawer}> 
       <Scene component={Home} key='home' title='Home' type='reset' initial={true}/> 
      </Scene> 
      </Scene> 
     </RouterWithRedux> 
     </Provider> 
    ) 
    } 
} 

Sau đó, tôi nhấn một nút trong Login và nó gây nên Actions. để điều hướng đến.

Các NavDrawer là:

import React, { PropTypes } from 'react' 
import Drawer from 'react-native-drawer' 
import { Actions, DefaultRenderer } from 'react-native-router-flux' 

import NavDrawerPanel from './NavDrawerPanel' 

export default class NavDrawer extends Component { 

    componentDidMount() { 
     Actions.refresh({key: 'drawer', ref: this.refs.navigation}); 
    } 

    render() { 
    const children = state.children; 

    return (
     <Drawer 
     ref="navigation" 
     type="displace" 
     content={<NavDrawerPanel />} 
     tapToClose 
     openDrawerOffset={0.2} 
     panCloseMask={0.2} 
     negotiatePan 
     tweenHandler={(ratio) => ({ 
      main: { opacity: Math.max(0.54, 1 - ratio) }, 
     })} 
     > 
     <DefaultRenderer 
      navigationState={children[0]} 
      onNavigate={this.props.onNavigate} 
     /> 
     </Drawer> 
    ); 
    } 
} 

Và NavDrawerPanel là:

import React from 'react'; 
import {PropTypes} from "react"; 
import { 
    StyleSheet, 
    Text, 
    View, 
} from "react-native"; 
import { Actions } from 'react-native-router-flux'; 

const NavDrawerPanel = (props, context) => { 
    const drawer = context.drawer; 
    return (
    <View style={styles.container}> 
     <TouchableHighlight onPress={Actions.home}> 
     <Text>Home Page</Text> 
     </TouchableHighlight> 
     <TouchableHighlight onPress={Actions.login}> 
     <Text>Login Page</Text> 
     </TouchableHighlight> 
    </View> 
) 
} 

const styles = StyleSheet.create({ 
    container: { 
    flex: 1, 
    padding: 30, 
    backgroundColor: 'black' 
    }, 
}) 

EDIT Dưới đây là những gì đang được nhập khẩu nơi Scene + Redux được thiết lập:

// @flow 
import React, { Component } from 'react' 
import { 
    ActionConst, 
    Actions, 
    Router, 
    Scene, 
} from 'react-native-router-flux' 
import { 
    Provider, 
    connect, 
} from 'react-redux' 

import configureStore from './store/configureStore' 
import Login from './components/Login' 
import Home from './components/Home' 
import NavDrawer from './components/NavDrawer' 

EDIT 2 - console.log (this.props)

Làm console.log (this.props) trong thành phần Login: enter image description here

Khi Actions.home() từ thành phần Login: enter image description here

Khi Actions.drawer() từ thành phần Login: enter image description here

EDIT 3 - console.log (this.props) bên NavDrawer.js

Các NavDrawer không bao giờ được trả lại để console.log (this.props) không thường xuyên bị thoát

Nhưng với console.log (this.props) bên NavDrawer.js và Actions.home, tôi nhận được:

enter image description here

Và với console.log (this.props) bên trong NavDrawer.js và Tác vụ.ngăn kéo, tôi nhận được:

enter image description here

+0

bạn có chắc chắn đang nhập mọi thứ chính xác không? – octohedron

+0

@Gazta Có, chính xác cách hiển thị trong bài đăng gốc. Có thể vấn đề là ngăn kéo cần phải được thực hiện khác nhau vì nó có thiết lập redux không? –

+0

đăng phần còn lại của tệp mà bạn đang thiết lập cảnh – octohedron

Trả lời

0

Không chắc nếu đây là vấn đề nhưng bạn dường như không được nhập khẩu TouchableHighlight trên thành phần NavDrawerPanel, vì vậy:

import { 
    StyleSheet, 
    Text, 
    View, 
    TouchableHighlight 
} from "react-native"; 
+0

Rất tiếc, nó đã được nhập nhưng chỉ bị mất khi sao chép mã. Đối với tôi, lỗi có thể liên quan đến 'DefaultRenderer'? Nhưng dường như không thể tìm ra điều gì sai? –

+0

Kiểm tra xem bạn có thấy nhận xét trước của tôi không. Làm ơn cho tôi biết. –

0

Tôi nghĩ rằng bạn vượt qua trong giá trị sai cho navigationState trong DefaultRenderer. Nó phải là

const { navigationState: { children } } = this.props;

Trong lớp NavDrawer bạn

import React, { PropTypes } from 'react' 
import Drawer from 'react-native-drawer' 
import { Actions, DefaultRenderer } from 'react-native-router-flux' 

import NavDrawerPanel from './NavDrawerPanel' 

export default class NavDrawer extends Component { 

    componentDidMount() { 
     Actions.refresh({key: 'drawer', ref: this.refs.navigation}); 
    } 

    render() { 
    //const children = state.children; //wrong 
    const { navigationState: { children } } = this.props; 
    return (
     <Drawer 
     ref="navigation" 
     type="displace" 
     content={<NavDrawerPanel />} 
     tapToClose 
     openDrawerOffset={0.2} 
     panCloseMask={0.2} 
     negotiatePan 
     tweenHandler={(ratio) => ({ 
      main: { opacity: Math.max(0.54, 1 - ratio) }, 
     })} 
     > 
     <DefaultRenderer 
      navigationState={children[0]} 
      onNavigate={this.props.onNavigate} 
     /> 
     </Drawer> 
    ); 
    } 
} 
+0

Đánh giá cao gợi ý và thử nó, nhưng tiếc là vẫn nhận được lỗi 'Loại phần tử không hợp lệ: dự kiến ​​một chuỗi (cho các thành phần tích hợp) hoặc một lớp/chức năng (đối với các thành phần tổng hợp) nhưng có: đối tượng. Kiểm tra phương thức hiển thị của 'DefaultRenderer''. Tôi giả định lỗi đã làm với 'DefaultRenderer' nhưng vẫn không thể tìm ra chính xác những gì –

+0

Xin vui lòng cho tôi biết nếu bạn đã nhìn thấy bình luận cuối cùng của tôi. –

+0

Bạn có thể đăng mã thành phần nhà của bạn và đăng nhập đầu ra của navigationState khi điều hướng đến cảnh nhà và ngăn kéo không? Bạn gọi Actions.home() và Action.drawer() từ đâu? Bằng cách này, bạn không nên điều hướng đến cảnh ngăn bằng cách sử dụng Actions.drawer() vì khung cảnh trong cảnh ngăn kéo của bạn trong cấu hình bộ định tuyến sẽ chứa ngăn chứa – alpha

0

Tôi không phải là một chuyên gia trong việc này nhưng tôi đang sử dụng phản ứng bản địa-router-flux và phản ứng bản địa-ngăn kéo trong ứng dụng của tôi mà không có bất kỳ vấn đề gì. Một số khác biệt tôi thấy giữa mã của bạn và của tôi là:

  1. Bạn có hai cảnh được đặt thành initial={true}. Điều này có thể làm hỏng Router.
  2. Tôi không điều hướng trực tiếp đến ngăn kéo bằng cách sử dụng Actions.drawer nhưng thay vào đó tôi điều hướng đến cảnh nhà bằng cách sử dụng Actions.home.

Nếu không có công trình nào trong số này hoạt động, bạn có thể chia sẻ chức năng render() của thành phần nhà bạn không?

0

Không chắc chắn nếu điều này vẫn còn một cái gì đó bạn đang làm việc trên, nhưng đối với những người khác sử dụng các thư viện, bạn chắc chắn không muốn sử dụng ngăn kéo như là một cảnh. Nó sẽ quấn cho bạn toàn bộ bộ định tuyến như vậy:

<Drawer 
    ref={(ref) => { this.drawer = ref; }} 
    type="displace" 
    useInteractionManager 
    content={ 
     <SideMenuContent 
     open={this.state.sideMenuOpen} 
     openDrawer={this.openDrawer} 
     closeDrawer={this.closeDrawer} 
     /> 
    } 
    tapToClose 
    openDrawerOffset={0.08} 
    negotiatePan 
    onOpenStart={() => { this.setState({ sideMenuOpen: true }); }} 
    onClose={() => { this.setState({ sideMenuOpen: false }); }} 
    > 
    <RouterWithRedux 
     scenes={this.scenes} 
    /> 
    </Drawer> 

Đó là cách chúng tôi đã kết nối và hoạt động tốt. Sau đó, chúng tôi chỉ chuyển các chức năng này vào cảnh của chúng tôi khi cần:

openDrawer =() => { 
    this.drawer.open(); 
} 

closeDrawer =() => { 
    this.drawer.close(); 
} 
Các vấn đề liên quan