New Handling Touches Tutorial
Summary: Finally, a place where `Button` is properly introduced. This is based on the old Handling Touches guide, which has been simplified (with some content moved over to the scroll views tutorial). I've also updated the ordering of the guides into something that makes more sense to someone just getting started with React Native. Closes https://github.com/facebook/react-native/pull/14371 Differential Revision: D5201127 Pulled By: hramos fbshipit-source-id: 819192e2db9febb8a315f51693dae557752b6002
This commit is contained in:
parent
81c2f3b189
commit
f42f2dff37
|
@ -5,7 +5,7 @@ layout: docs
|
|||
category: Guides
|
||||
permalink: docs/accessibility.html
|
||||
next: timers
|
||||
previous: debugging
|
||||
previous: animations
|
||||
---
|
||||
|
||||
## Native App Accessibility (iOS and Android)
|
||||
|
|
|
@ -153,11 +153,11 @@ Start by following the `Point Gradle to your Android SDK` section of this page.
|
|||
./gradlew ReactAndroid:installArchives
|
||||
```
|
||||
|
||||
This will package everything that would typically be included in the `android` directory of your `node_modules/react-native/` installation in the root directory of your React Native checkout.
|
||||
This will package everything that would typically be included in the `android` directory of your `node_modules/react-native/` installation in the root directory of your React Native checkout.
|
||||
|
||||
## Testing
|
||||
|
||||
If you made changes to React Native and submit a pull request, all tests will run on your pull request automatically. To run the tests locally, see [Testing](docs/testing.html).
|
||||
If you made changes to React Native and submit a pull request, all tests will run on your pull request automatically. To run the tests locally, see [Running Tests](docs/testing.html).
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
|
|
|
@ -4,8 +4,8 @@ title: Animations
|
|||
layout: docs
|
||||
category: Guides
|
||||
permalink: docs/animations.html
|
||||
next: navigation
|
||||
previous: handling-touches
|
||||
next: accessibility
|
||||
previous: images
|
||||
---
|
||||
|
||||
Animations are very important to create a great user experience.
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
id: building-for-apple-tv
|
||||
title: Building For Apple TV
|
||||
layout: docs
|
||||
category: Guides (Apple TV)
|
||||
category: Guides (iOS)
|
||||
permalink: docs/building-for-apple-tv.html
|
||||
banner: ejected
|
||||
next: native-modules-android
|
||||
|
@ -84,12 +84,10 @@ class Game2048 extends React.Component {
|
|||
|
||||
```
|
||||
|
||||
- *TV remote animations*: `RCTTVView` native code implements Apple-recommended parallax animations to help guide the eye as the user navigates through views. The animations can be disabled or adjusted with new optional view properties.
|
||||
- *TV remote animations*: `RCTTVView` native code implements Apple-recommended parallax animations to help guide the eye as the user navigates through views. The animations can be disabled or adjusted with new optional view properties.
|
||||
|
||||
- *Back navigation with the TV remote menu button*: The `BackHandler` component, originally written to support the Android back button, now also supports back navigation on the Apple TV using the menu button on the TV remote.
|
||||
|
||||
- *Known issues*:
|
||||
|
||||
- [ListView scrolling](https://github.com/facebook/react-native/issues/12793). The issue can be easily worked around by setting `removeClippedSubviews` to false in ListView and similar components. For more discussion of this issue, see [this PR](https://github.com/facebook/react-native/pull/12944).
|
||||
|
||||
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
---
|
||||
id: colors
|
||||
title: Colors
|
||||
title: Color Reference
|
||||
layout: docs
|
||||
category: Guides
|
||||
permalink: docs/colors.html
|
||||
next: platform-specific-code
|
||||
previous: images
|
||||
next: integration-with-existing-apps
|
||||
previous: direct-manipulation
|
||||
---
|
||||
|
||||
Components in React Native are [styled using JavaScript](docs/style.html). Color properties usually match how [CSS works on the web](https://developer.mozilla.org/en-US/docs/Web/CSS/color_value).
|
||||
|
|
|
@ -4,8 +4,8 @@ title: Debugging
|
|||
layout: docs
|
||||
category: Guides
|
||||
permalink: docs/debugging.html
|
||||
next: accessibility
|
||||
previous: platform-specific-code
|
||||
next: performance
|
||||
previous: timers
|
||||
---
|
||||
|
||||
## Enabling Keyboard Shortcuts
|
||||
|
|
|
@ -4,7 +4,7 @@ title: Direct Manipulation
|
|||
layout: docs
|
||||
category: Guides
|
||||
permalink: docs/direct-manipulation.html
|
||||
next: performance
|
||||
next: colors
|
||||
previous: javascript-environment
|
||||
---
|
||||
|
||||
|
@ -267,4 +267,3 @@ Requests focus for the given input or view. The exact behavior triggered will de
|
|||
### blur()
|
||||
|
||||
Removes focus from an input or view. This is the opposite of `focus()`.
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@ title: Gesture Responder System
|
|||
layout: docs
|
||||
category: Guides
|
||||
permalink: docs/gesture-responder-system.html
|
||||
next: testing
|
||||
next: javascript-environment
|
||||
previous: performance
|
||||
---
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@ title: Handling Text Input
|
|||
layout: docs
|
||||
category: The Basics
|
||||
permalink: docs/handling-text-input.html
|
||||
next: using-a-scrollview
|
||||
next: handling-touches
|
||||
previous: flexbox
|
||||
---
|
||||
|
||||
|
|
|
@ -2,41 +2,97 @@
|
|||
id: handling-touches
|
||||
title: Handling Touches
|
||||
layout: docs
|
||||
category: Guides
|
||||
category: The Basics
|
||||
permalink: docs/handling-touches.html
|
||||
next: animations
|
||||
previous: components
|
||||
next: using-a-scrollview
|
||||
previous: handling-text-input
|
||||
---
|
||||
|
||||
Users interact with mobile apps mainly through touch. They can use a combination of gestures, such as tapping on a button, scrolling a list, or zooming on a map.
|
||||
Users interact with mobile apps mainly through touch. They can use a combination of gestures, such as tapping on a button, scrolling a list, or zooming on a map. React Native provides components to handle all sorts of common gestures, as well as a comprehensive [gesture responder system](docs/gesture-responder-system.html) to allow for more advanced gesture recognition, but the one component you will most likely be interested in is the basic Button.
|
||||
|
||||
React Native provides components to handle common gestures, such as taps and swipes, as well as a comprehensive [gesture responder system](docs/gesture-responder-system.html) to allow for more advanced gesture recognition.
|
||||
## Displaying a basic button
|
||||
|
||||
## Tappable Components
|
||||
|
||||
You can use "Touchable" components when you want to capture a tapping gesture. They take a function through the `onPress` props which will be called when the touch begins and ends within the bounds of the component.
|
||||
|
||||
Example:
|
||||
[Button](docs/button.html) provides a basic button component that is rendered nicely on all platforms. The minimal example to display a button looks like this:
|
||||
|
||||
```javascript
|
||||
class MyButton extends Component {
|
||||
<Button
|
||||
onPress={() => { Alert.alert('You tapped the button!')}}
|
||||
title="Press Me"
|
||||
/>
|
||||
```
|
||||
|
||||
This will render a blue label on iOS, and a blue rounded rectangle with white text on Android. Pressing the button will call the "onPress" function, which in this case displays an alert popup. If you like, you can specify a "color" prop to change the color of your button.
|
||||
|
||||
![](img/Button.png)
|
||||
|
||||
Go ahead and play around with the `Button` component using the example below. You can select which platform your app is previewed in by clicking on the toggle in the bottom right, then click on "Tap to Play" to preview the app.
|
||||
|
||||
```SnackPlayer?name=Button%20Basics
|
||||
import React, { Component } from 'react';
|
||||
import { Alert, AppRegistry, Button, StyleSheet, View } from 'react-native';
|
||||
|
||||
export default class ButtonBasics extends Component {
|
||||
_onPressButton() {
|
||||
console.log("You tapped the button!");
|
||||
Alert.alert('You tapped the button!')
|
||||
}
|
||||
|
||||
render() {
|
||||
return (
|
||||
<TouchableHighlight onPress={this._onPressButton}>
|
||||
<Text>Button</Text>
|
||||
</TouchableHighlight>
|
||||
<View style={styles.container}>
|
||||
<View style={styles.buttonContainer}>
|
||||
<Button
|
||||
onPress={this._onPressButton}
|
||||
title="Press Me"
|
||||
/>
|
||||
</View>
|
||||
<View style={styles.buttonContainer}>
|
||||
<Button
|
||||
onPress={this._onPressButton}
|
||||
title="Press Me"
|
||||
color="#841584"
|
||||
/>
|
||||
</View>
|
||||
<View style={styles.alternativeLayoutButtonContainer}>
|
||||
<Button
|
||||
onPress={this._onPressButton}
|
||||
title="This looks great!"
|
||||
/>
|
||||
<Button
|
||||
onPress={this._onPressButton}
|
||||
title="OK!"
|
||||
color="#841584"
|
||||
/>
|
||||
</View>
|
||||
</View>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
const styles = StyleSheet.create({
|
||||
container: {
|
||||
flex: 1,
|
||||
justifyContent: 'center',
|
||||
},
|
||||
buttonContainer: {
|
||||
margin: 20
|
||||
},
|
||||
alternativeLayoutButtonContainer: {
|
||||
margin: 20,
|
||||
flexDirection: 'row',
|
||||
justifyContent: 'space-between'
|
||||
}
|
||||
})
|
||||
|
||||
// skip this line if using Create React Native App
|
||||
AppRegistry.registerComponent('AwesomeProject', () => ButtonBasics);
|
||||
```
|
||||
|
||||
Tappable components should provide feedback that show the user what is handling their touch, and what will happen when they lift their finger. The user should also be able to cancel a tap by dragging their finger away.
|
||||
|
||||
Which component you use will depend on what kind of feedback you want to provide:
|
||||
## Touchables
|
||||
|
||||
If the basic button doesn't look right for your app, you can build your own button using any of the "Touchable" components provided by React Native. The "Touchable" components provide the capability to capture tapping gestures, and can display feedback when a gesture is recognized. These components do not provide any default styling, however, so you will need to do a bit of work to get them looking nicely in your app.
|
||||
|
||||
Which "Touchable" component you use will depend on what kind of feedback you want to provide:
|
||||
|
||||
- Generally, you can use [**TouchableHighlight**](docs/touchablehighlight.html) anywhere you would use a button or link on web. The view's background will be darkened when the user presses down on the button.
|
||||
|
||||
|
@ -46,22 +102,82 @@ Which component you use will depend on what kind of feedback you want to provide
|
|||
|
||||
- If you need to handle a tap gesture but you don't want any feedback to be displayed, use [**TouchableWithoutFeedback**](docs/touchablewithoutfeedback.html).
|
||||
|
||||
### Long presses
|
||||
In some cases, you may want to detect when a user presses and holds a view for a set amount of time. These long presses can be handled by passing a function to the `onLongPress` props of any of the "Touchable" components.
|
||||
|
||||
In some cases, you may want to detect when a user presses and holds a view for a set amount of time. These long presses can be handled by passing a function to the `onLongPress` props of any of the touchable components listed above.
|
||||
Let's see all of these in action:
|
||||
|
||||
## Scrolling lists and swiping views
|
||||
```SnackPlayer?platform=android&name=Touchables
|
||||
import React, { Component } from 'react';
|
||||
import { Alert, AppRegistry, Platform, StyleSheet, Text, TouchableHighlight, TouchableOpacity, TouchableNativeFeedback, TouchableWithoutFeedback, View } from 'react-native';
|
||||
|
||||
A common pattern to many mobile apps is the scrollable list of items. Users interact with these using panning or swiping gestures. The [ScrollView](docs/using-a-scrollview.html) component displays a list of items that can be scrolled using these gestures.
|
||||
export default class Touchables extends Component {
|
||||
_onPressButton() {
|
||||
Alert.alert('You tapped the button!')
|
||||
}
|
||||
|
||||
ScrollViews can scroll vertically or horizontally, and can be configured to allow paging through views using swiping gestures by using the `pagingEnabled` props. Swiping horizontally between views can also be implemented on Android using the [ViewPagerAndroid](docs/viewpagerandroid.html) component.
|
||||
_onLongPressButton() {
|
||||
Alert.alert('You long-pressed the button!')
|
||||
}
|
||||
|
||||
A [FlatList](docs/using-a-listview.html) is a special kind of ScrollView that is best suited for displaying long vertical lists of items. If you want to display section headers and footers, similar to `UITableView`s on iOS, then [SectionList](docs/using-a-listview.html) is the way to go.
|
||||
|
||||
### Pinch-to-zoom
|
||||
render() {
|
||||
return (
|
||||
<View style={styles.container}>
|
||||
<TouchableHighlight onPress={this._onPressButton} underlayColor="white">
|
||||
<View style={styles.button}>
|
||||
<Text style={styles.buttonText}>TouchableHighlight</Text>
|
||||
</View>
|
||||
</TouchableHighlight>
|
||||
<TouchableOpacity onPress={this._onPressButton}>
|
||||
<View style={styles.button}>
|
||||
<Text style={styles.buttonText}>TouchableOpacity</Text>
|
||||
</View>
|
||||
</TouchableOpacity>
|
||||
<TouchableNativeFeedback
|
||||
onPress={this._onPressButton}
|
||||
background={Platform.OS === 'android' ? TouchableNativeFeedback.SelectableBackground() : ''}>
|
||||
<View style={styles.button}>
|
||||
<Text style={styles.buttonText}>TouchableNativeFeedback</Text>
|
||||
</View>
|
||||
</TouchableNativeFeedback>
|
||||
<TouchableWithoutFeedback
|
||||
onPress={this._onPressButton}
|
||||
>
|
||||
<View style={styles.button}>
|
||||
<Text style={styles.buttonText}>TouchableWithoutFeedback</Text>
|
||||
</View>
|
||||
</TouchableWithoutFeedback>
|
||||
<TouchableHighlight onPress={this._onPressButton} onLongPress={this._onLongPressButton} underlayColor="white">
|
||||
<View style={styles.button}>
|
||||
<Text style={styles.buttonText}>Touchable with Long Press</Text>
|
||||
</View>
|
||||
</TouchableHighlight>
|
||||
</View>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
A ScrollView with a single item can be used to allow the user to zoom content. Set up the `maximumZoomScale` and `minimumZoomScale` props and your user will be able to use pinch and expand gestures to zoom in and out.
|
||||
const styles = StyleSheet.create({
|
||||
container: {
|
||||
paddingTop: 60,
|
||||
alignItems: 'center'
|
||||
},
|
||||
button: {
|
||||
marginBottom: 30,
|
||||
width: 260,
|
||||
alignItems: 'center',
|
||||
backgroundColor: '#2196F3'
|
||||
},
|
||||
buttonText: {
|
||||
padding: 20,
|
||||
color: 'white'
|
||||
}
|
||||
})
|
||||
|
||||
## Handling additional gestures
|
||||
// skip this line if using Create React Native App
|
||||
AppRegistry.registerComponent('AwesomeProject', () => Touchables);
|
||||
```
|
||||
|
||||
If you want to allow a user to drag a view around the screen, or you want to implement your own custom pan/drag gesture, take a look at the [PanResponder](docs/panresponder.html) API or the [gesture responder system docs](docs/gesture-responder-system.html).
|
||||
## Scrolling lists, swiping pages, and pinch-to-zoom
|
||||
|
||||
Another gesture commonly used in mobile apps is the swipe or pan. This gesture allows the user to scroll through a list of items, or swipe through pages of content. In order to handle these and other gestures, we'll learn [how to use a ScrollView](docs/using-a-scrollview.html) next.
|
||||
|
|
|
@ -4,7 +4,7 @@ title: Images
|
|||
layout: docs
|
||||
category: Guides
|
||||
permalink: docs/images.html
|
||||
next: colors
|
||||
next: animations
|
||||
previous: navigation
|
||||
---
|
||||
|
||||
|
@ -96,9 +96,9 @@ Many of the images you will display in your app will not be available at compile
|
|||
```
|
||||
|
||||
### Network Requests for Images
|
||||
|
||||
|
||||
If you would like to set such things as the HTTP-Verb, Headers or a Body along with the image request, you may do this by defining these properties on the source object:
|
||||
|
||||
|
||||
```javascript
|
||||
<Image source={{
|
||||
uri: 'https://facebook.github.io/react/img/logo_og.png',
|
||||
|
|
|
@ -6,7 +6,7 @@ category: Guides
|
|||
permalink: docs/integration-with-existing-apps.html
|
||||
banner: ejected
|
||||
next: running-on-device
|
||||
previous: testing
|
||||
previous: colors
|
||||
---
|
||||
|
||||
<style>
|
||||
|
|
|
@ -5,7 +5,7 @@ layout: docs
|
|||
category: Guides
|
||||
permalink: docs/javascript-environment.html
|
||||
next: direct-manipulation
|
||||
previous: timers
|
||||
previous: gesture-responder-system
|
||||
---
|
||||
|
||||
## JavaScript Runtime
|
||||
|
|
|
@ -4,8 +4,8 @@ title: More Resources
|
|||
layout: docs
|
||||
category: The Basics
|
||||
permalink: docs/more-resources.html
|
||||
next: components
|
||||
previous: networking
|
||||
next: platform-specific-code
|
||||
previous: network
|
||||
---
|
||||
|
||||
If you just read through this website, you should be able to build a pretty cool React Native app. But React Native isn't just a product made by one company - it's a community of thousands of developers. So if you're interested in React Native, here's some related stuff you might want to check out.
|
||||
|
@ -34,8 +34,6 @@ The folks who built the app for Facebook's F8 conference in 2016 also [open-sour
|
|||
|
||||
[Expo](https://docs.expo.io) is a development environment plus application that focuses on letting you build React Native apps in the Expo development environment, without ever touching Xcode or Android Studio. If you wish React Native was even more JavaScripty and webby, check out Expo.
|
||||
|
||||
[Deco](https://www.decoide.org) is an all-in-one development environment specifically designed for React Native. It can automatically set up a new project, search for open source components, and insert them. You can also tweak your app graphically in real time. Check it out if you use macOS.
|
||||
|
||||
## Where React Native People Hang Out
|
||||
|
||||
The [React Native Community](https://www.facebook.com/groups/react.native.community) Facebook group has thousands of developers, and it's pretty active. Come there to show off your project, or ask how other people solved similar problems.
|
||||
|
@ -46,4 +44,4 @@ The [React Twitter account](https://twitter.com/reactjs) covers both React and R
|
|||
|
||||
There are a lot of [React Native Meetups](http://www.meetup.com/topics/react-native/) that happen around the world. Often there is React Native content in React meetups as well.
|
||||
|
||||
Sometimes we have React conferences. We posted the [videos from React.js Conf 2016](https://www.youtube.com/playlist?list=PLb0IAmt7-GS0M8Q95RIc2lOM6nc77q1IY), and we'll probably have more conferences in the future, too. Stay tuned.
|
||||
Sometimes we have React conferences. We posted the [videos from React.js Conf 2017](https://www.youtube.com/playlist?list=PLb0IAmt7-GS3fZ46IGFirdqKTIxlws7e0) and [React.js Conf 2016](https://www.youtube.com/playlist?list=PLb0IAmt7-GS0M8Q95RIc2lOM6nc77q1IY), and we'll probably have more conferences in the future, too. Stay tuned. You can also find a list of dedicated React Native conferences [here](http://www.awesome-react-native.com/#conferences).
|
||||
|
|
|
@ -6,7 +6,7 @@ category: Guides (Android)
|
|||
permalink: docs/native-modules-android.html
|
||||
banner: ejected
|
||||
next: native-components-android
|
||||
previous: communication-ios
|
||||
previous: building-for-apple-tv
|
||||
---
|
||||
|
||||
Sometimes an app needs access to a platform API that React Native doesn't have a corresponding module for yet. Maybe you want to reuse some existing Java code without having to reimplement it in JavaScript, or write some high performance, multi-threaded code such as for image processing, a database, or any number of advanced extensions.
|
||||
|
|
|
@ -1,14 +1,17 @@
|
|||
---
|
||||
id: navigation
|
||||
title: Navigation
|
||||
title: Navigating Between Screens
|
||||
layout: docs
|
||||
category: Guides
|
||||
permalink: docs/navigation.html
|
||||
next: images
|
||||
previous: animations
|
||||
previous: platform-specific-code
|
||||
---
|
||||
|
||||
This guide covers the various navigation components available in React Native. If you are just getting started with navigation, you will probably want to use [React Navigation](docs/navigation.html#react-navigation). React Navigation provides an easy to use navigation solution, with the ability to present common stack navigation and tabbed navigation patterns on both iOS and Android. As this is a JavaScript implementation, it provides the greatest amount of configurability as well as flexibility when integrating with state management libraries such as [redux](https://reactnavigation.org/docs/guides/redux).
|
||||
Mobile apps are rarely made up of a single screen. Managing the presentation of, and transition between, multiple screens is typically handled by what is known as a navigator.
|
||||
|
||||
This guide covers the various navigation components available in React Native.
|
||||
If you are just getting started with navigation, you will probably want to use [React Navigation](docs/navigation.html#react-navigation). React Navigation provides an easy to use navigation solution, with the ability to present common stack navigation and tabbed navigation patterns on both iOS and Android. As this is a JavaScript implementation, it provides the greatest amount of configurability as well as flexibility when integrating with state management libraries such as [redux](https://reactnavigation.org/docs/guides/redux).
|
||||
|
||||
If you're only targeting iOS, you may want to also check out [NavigatorIOS](docs/navigation.html#navigatorios) as a way of providing a native look and feel with minimal configuration, as it provides a wrapper around the native `UINavigationController` class. This component will not work on Android, however.
|
||||
|
||||
|
|
|
@ -160,7 +160,6 @@ var ws = new WebSocket('ws://host.com/path');
|
|||
|
||||
ws.onopen = () => {
|
||||
// connection opened
|
||||
|
||||
ws.send('something'); // send a message
|
||||
};
|
||||
|
||||
|
@ -180,6 +179,6 @@ ws.onclose = (e) => {
|
|||
};
|
||||
```
|
||||
|
||||
## High Five!
|
||||
## High Five!
|
||||
|
||||
If you've gotten here by reading linearly through the tutorial, then you are a pretty impressive human being. Congratulations. Next, you might want to check out [all the cool stuff the community does with React Native](docs/more-resources.html).
|
||||
|
|
|
@ -5,7 +5,7 @@ layout: docs
|
|||
category: Guides
|
||||
permalink: docs/performance.html
|
||||
next: gesture-responder-system
|
||||
previous: direct-manipulation
|
||||
previous: debugging
|
||||
---
|
||||
|
||||
A compelling reason for using React Native instead of WebView-based tools is to achieve 60 frames per second and a native look and feel to your apps.
|
||||
|
|
|
@ -4,8 +4,8 @@ title: Platform Specific Code
|
|||
layout: docs
|
||||
category: Guides
|
||||
permalink: docs/platform-specific-code.html
|
||||
next: debugging
|
||||
previous: colors
|
||||
next: navigation
|
||||
previous: more-resources
|
||||
---
|
||||
|
||||
When building a cross-platform app, you'll want to re-use as much code as possible. Scenarios may arise where it makes sense for the code to be different, for example you may want to implement separate visual components for iOS and Android.
|
||||
|
@ -72,8 +72,8 @@ On Android, the `Platform` module can also be used to detect the version of the
|
|||
```javascript
|
||||
import { Platform } from 'react-native';
|
||||
|
||||
if(Platform.Version === 21){
|
||||
console.log('Running on Lollipop!');
|
||||
if (Platform.Version === 25) {
|
||||
console.log('Running on Nougat!');
|
||||
}
|
||||
```
|
||||
|
||||
|
|
|
@ -80,6 +80,8 @@ previous: integration-with-existing-apps
|
|||
|
||||
It's always a good idea to test your app on an actual device before releasing it to your users. This document will guide you through the necessary steps to run your React Native app on a device and to get it ready for production.
|
||||
|
||||
If you used Create React Native App to set up your project, you can preview your app on a device by scanning the QR code with the Expo app. In order to build and run your app on a device, you will need to eject and install the native code dependencies from the [Getting Started guide](docs/getting-started.html).
|
||||
|
||||
<div class="toggler">
|
||||
|
||||
<ul role="tablist" >
|
||||
|
|
|
@ -1,17 +1,15 @@
|
|||
---
|
||||
id: testing
|
||||
title: Testing
|
||||
title: Running Tests and Contributing
|
||||
layout: docs
|
||||
category: Guides
|
||||
permalink: docs/testing.html
|
||||
next: understanding-cli
|
||||
previous: gesture-responder-system
|
||||
previous: upgrading
|
||||
---
|
||||
|
||||
This document is about running tests on React Native itself. If you're interested in testing a React Native app, check out the [React Native Tutorial](http://facebook.github.io/jest/docs/tutorial-react-native.html) on the Jest website.
|
||||
|
||||
## Running Tests and Contributing
|
||||
|
||||
The React Native repo has several tests you can run to verify you haven't caused a regression with your PR. These tests are run with the [Travis](https://travis-ci.org/facebook/react-native/builds) and [CircleCI](https://circleci.com/gh/facebook/react-native) continuous integration systems, which will automatically annotate pull requests with the test results.
|
||||
|
||||
Whenever you are fixing a bug or adding new functionality to React Native, you should add a test that covers it. Depending on the change you're making, there are different types of tests that may be appropriate.
|
||||
|
|
|
@ -4,7 +4,7 @@ title: Timers
|
|||
layout: docs
|
||||
category: Guides
|
||||
permalink: docs/timers.html
|
||||
next: javascript-environment
|
||||
next: debugging
|
||||
previous: accessibility
|
||||
---
|
||||
|
||||
|
|
|
@ -33,23 +33,29 @@ export default class HelloWorldApp extends Component {
|
|||
AppRegistry.registerComponent('AwesomeProject', () => HelloWorldApp);
|
||||
```
|
||||
|
||||
If you are feeling curious, you can play around with sample code directly in the web simulators. You can also paste it into your `index.ios.js` or `index.android.js` file to create a real app on your local machine.
|
||||
If you are feeling curious, you can play around with sample code directly in the web simulators. You can also paste it into your `App.js`, `index.ios.js`, or `index.android.js` file to create a real app on your local machine.
|
||||
|
||||
## What's going on here?
|
||||
|
||||
Some of the things in here might not look like JavaScript to you. Don't panic. This is the future.
|
||||
Some of the things in here might not look like JavaScript to you. Don't panic. _This is the future_.
|
||||
|
||||
First of all, ES2015 (also known as ES6) is a set of improvements to JavaScript that is now part of the official standard, but not yet supported by all browsers, so often it isn't used yet in web development. React Native ships with ES2015 support, so you can use this stuff without worrying about compatibility. `import`, `from`, `class`, `extends`, and the `() =>` syntax in the example above are all ES2015 features. If you aren't familiar with ES2015, you can probably pick it up just by reading through sample code like this tutorial has. If you want, [this page](https://babeljs.io/docs/learn-es2015/) has a good overview of ES2015 features.
|
||||
First of all, ES2015 (also known as ES6) is a set of improvements to JavaScript that is now part of the official standard, but not yet supported by all browsers, so often it isn't used yet in web development. React Native ships with ES2015 support, so you can use this stuff without worrying about compatibility. `import`, `from`, `class`, `extends`, and the `() =>` syntax in the example above are all ES2015 features. If you aren't familiar with ES2015, you can probably pick it up just by reading through sample code like this tutorial has. If you want, [this page](https://babeljs.io/learn-es2015/) has a good overview of ES2015 features.
|
||||
|
||||
The other unusual thing in this code example is `<Text>Hello world!</Text>`. This is JSX - a syntax for embedding XML within JavaScript. Many frameworks use a special templating language which lets you embed code inside markup language. In React, this is reversed. JSX lets you write your markup language inside code. It looks like HTML on the web, except instead of web things like `<div>` or `<span>`, you use React components. In this case, `<Text>`
|
||||
is a built-in component that just displays some text.
|
||||
|
||||
## Component and AppRegistry
|
||||
## Components
|
||||
|
||||
So this code is defining `HelloWorldApp`, a new `Component`, and it's registering it with the `AppRegistry`. When you're building a React Native app, you'll be making new components a lot. Anything you see on the screen is some sort of component. A component can be pretty simple - the only thing that's required is a `render` function which returns some JSX to render.
|
||||
So this code is defining `HelloWorldApp`, a new `Component`. When you're building a React Native app, you'll be making new components a lot. Anything you see on the screen is some sort of component. A component can be pretty simple - the only thing that's required is a `render` function which returns some JSX to render.
|
||||
|
||||
The `AppRegistry` just tells React Native which component is the root one for the whole application. You won't be thinking about `AppRegistry` a lot - there will probably just be one call to `AppRegistry.registerComponent` in your whole app. It's included in these examples so you can paste the whole thing into your `index.ios.js` or `index.android.js` file and get it running. If you have a project from Create React Native App, this is handled for you and it's not necessary to call AppRegistry in your code.
|
||||
<div class="banner-crna-ejected">
|
||||
<h3>Projects With Native Code Only</h3>
|
||||
<p>
|
||||
In the particular example above, <code>HelloWorldApp</code> is registered with the <code>AppRegistry</code>. The <code>AppRegistry</code> just tells React Native which component is the root one for the whole application. It's included in these examples so you can paste the whole thing into your <code>index.ios.js</code> or <code>index.android.js</code> file and get it running. If you have a project from Create React Native App, this is handled for you and it's not necessary to call <code>AppRegistry</code> in your code.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
## This App Doesn't Do Very Much
|
||||
|
||||
## This app doesn't do very much
|
||||
|
||||
Good point. To make components do more interesting things, you need to [learn about Props](docs/props.html).
|
||||
|
|
|
@ -5,8 +5,8 @@ layout: docs
|
|||
category: Guides
|
||||
permalink: docs/understanding-cli.html
|
||||
banner: ejected
|
||||
next: integration-with-existing-apps
|
||||
previous: running-on-device
|
||||
next: native-modules-ios
|
||||
previous: testing
|
||||
---
|
||||
|
||||
Though you may have installed the `react-native-cli` via npm as a separate module, it is a shell for accessing the CLI embedded
|
||||
|
|
|
@ -4,8 +4,8 @@ title: Upgrading to new React Native versions
|
|||
layout: docs
|
||||
category: Guides
|
||||
permalink: docs/upgrading.html
|
||||
next: native-modules-ios
|
||||
previous: understanding-cli
|
||||
next: testing
|
||||
previous: running-on-device
|
||||
---
|
||||
|
||||
Upgrading to new versions of React Native will give you access to more APIs, views, developer tools and other goodies. Upgrading requires a small amount of effort, but we try to make it easy for you. The instructions are a bit different depending on whether you used `create-react-native-app` or `react-native init` to create your project.
|
||||
|
|
|
@ -58,7 +58,7 @@ const styles = StyleSheet.create({
|
|||
AppRegistry.registerComponent('AwesomeProject', () => FlatListBasics);
|
||||
```
|
||||
|
||||
If you want to render a set of data broken into logical sections, maybe with section headers, then a `SectionList` is the way to go.
|
||||
If you want to render a set of data broken into logical sections, maybe with section headers, similar to `UITableView`s on iOS, then a [SectionList](docs/sectionlist.html) is the way to go.
|
||||
|
||||
```SnackPlayer?name=SectionList%20Basics
|
||||
import React, { Component } from 'react';
|
||||
|
|
|
@ -5,10 +5,10 @@ layout: docs
|
|||
category: The Basics
|
||||
permalink: docs/using-a-scrollview.html
|
||||
next: using-a-listview
|
||||
previous: handling-text-input
|
||||
previous: handling-touches
|
||||
---
|
||||
|
||||
The [`ScrollView`](docs/scrollview.html) is a generic scrolling container that can host multiple components and views. The scrollable items need not be homogenous, and you can scroll both vertically and horizontally (by setting the `horizontal` property).
|
||||
The [ScrollView](docs/scrollview.html) is a generic scrolling container that can host multiple components and views. The scrollable items need not be homogenous, and you can scroll both vertically and horizontally (by setting the `horizontal` property).
|
||||
|
||||
This example creates a vertical `ScrollView` with both images and text mixed together.
|
||||
|
||||
|
@ -62,4 +62,8 @@ AppRegistry.registerComponent(
|
|||
() => IScrolledDownAndWhatHappenedNextShockedMe);
|
||||
```
|
||||
|
||||
`ScrollView` works best to present a small amount of things of a limited size. All the elements and views of a `ScrollView` are rendered, even if they are not currently shown on the screen. If you have a long list of more items that can fit on the screen, you should use a `FlatList` instead. So let's [learn about list views](docs/using-a-listview.html) next.
|
||||
ScrollViews can be configured to allow paging through views using swiping gestures by using the `pagingEnabled` props. Swiping horizontally between views can also be implemented on Android using the [ViewPagerAndroid](docs/viewpagerandroid.html) component.
|
||||
|
||||
A ScrollView with a single item can be used to allow the user to zoom content. Set up the `maximumZoomScale` and `minimumZoomScale` props and your user will be able to use pinch and expand gestures to zoom in and out.
|
||||
|
||||
The ScrollView works best to present a small amount of things of a limited size. All the elements and views of a `ScrollView` are rendered, even if they are not currently shown on the screen. If you have a long list of more items that can fit on the screen, you should use a `FlatList` instead. So let's [learn about list views](docs/using-a-listview.html) next.
|
||||
|
|
|
@ -136,4 +136,3 @@ pre[class*="language-"] {
|
|||
.token.entity {
|
||||
cursor: help;
|
||||
}
|
||||
|
||||
|
|
Binary file not shown.
After Width: | Height: | Size: 19 KiB |
|
@ -14,17 +14,19 @@ var Site = require('Site');
|
|||
|
||||
var support = React.createClass({
|
||||
childContextTypes: {
|
||||
permalink: PropTypes.string
|
||||
permalink: PropTypes.string,
|
||||
},
|
||||
|
||||
getChildContext: function() {
|
||||
return {permalink: 'support.html'};
|
||||
return { permalink: 'support.html' };
|
||||
},
|
||||
render: function() {
|
||||
return (
|
||||
<Site section="support" title="Help">
|
||||
|
||||
<section className="content wrap documentationContent helpSection nosidebar">
|
||||
<section
|
||||
className="content wrap documentationContent helpSection nosidebar"
|
||||
>
|
||||
<div className="helpSection inner-content">
|
||||
<h1>Need help?</h1>
|
||||
<p>
|
||||
|
@ -41,13 +43,25 @@ var support = React.createClass({
|
|||
|
||||
<ul>
|
||||
<li className="help-list-entry">
|
||||
<a href="/react-native/docs/getting-started.html">Getting Started</a>
|
||||
<a
|
||||
href="/react-native/docs/getting-started.html"
|
||||
>
|
||||
Getting Started
|
||||
</a>
|
||||
</li>
|
||||
<li className="help-list-entry">
|
||||
<a href="/react-native/docs/tutorial.html">The Basics Tutorial</a>
|
||||
<a
|
||||
href="/react-native/docs/tutorial.html"
|
||||
>
|
||||
The Basics Tutorial
|
||||
</a>
|
||||
</li>
|
||||
<li className="help-list-entry">
|
||||
<a href="/react-native/docs/integration-with-existing-apps.html">Integration With Existing Apps</a>
|
||||
<a
|
||||
href="/react-native/docs/integration-with-existing-apps.html"
|
||||
>
|
||||
Integration With Existing Apps
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
<h2>Explore samples</h2>
|
||||
|
@ -57,10 +71,16 @@ var support = React.createClass({
|
|||
|
||||
<ul>
|
||||
<li className="help-list-entry">
|
||||
<a href="http://makeitopen.com/">Building the F8 2016 App</a>
|
||||
<a href="http://makeitopen.com/">
|
||||
Building the F8 2016 App
|
||||
</a>
|
||||
</li>
|
||||
<li className="help-list-entry">
|
||||
<a href="https://github.com/facebook/react-native/tree/master/RNTester">RNTester</a>
|
||||
<a
|
||||
href="http://www.awesome-react-native.com/#open-source-apps"
|
||||
>
|
||||
Open Source apps
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
|
@ -71,13 +91,23 @@ var support = React.createClass({
|
|||
|
||||
<ul>
|
||||
<li className="help-list-entry">
|
||||
<a href="https://twitter.com/reactnative">React Native on Twitter</a>
|
||||
<a
|
||||
href="https://twitter.com/reactnative"
|
||||
>
|
||||
React Native on Twitter
|
||||
</a>
|
||||
</li>
|
||||
<li className="help-list-entry">
|
||||
<a href="/react-native/blog/">News and Updates</a>
|
||||
<a href="/react-native/blog/">
|
||||
News and Updates
|
||||
</a>
|
||||
</li>
|
||||
<li className="help-list-entry">
|
||||
<a href="https://github.com/facebook/react-native/releases">Latest Releases</a>
|
||||
<a
|
||||
href="https://github.com/facebook/react-native/releases"
|
||||
>
|
||||
Latest Releases
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
@ -92,19 +122,42 @@ var support = React.createClass({
|
|||
<li className="help-list-entry">
|
||||
<h3>Frequently Asked Questions</h3>
|
||||
<p>
|
||||
Many React Native users are active on Stack Overflow. Browse <a href="http://stackoverflow.com/questions/tagged/react-native">existing questions</a>, or ask your own technical question.
|
||||
Many React Native users are active on Stack Overflow. Browse
|
||||
{' '}
|
||||
<a
|
||||
href="http://stackoverflow.com/questions/tagged/react-native"
|
||||
>
|
||||
existing questions
|
||||
</a>
|
||||
, or ask your own technical question.
|
||||
</p>
|
||||
</li>
|
||||
<li className="help-list-entry">
|
||||
<h3>React Native Community</h3>
|
||||
<p>
|
||||
If you have an open-ended question or you just want to get a general sense of what React Native folks talk about, check out the <a href="https://www.facebook.com/groups/react.native.community">React Native Community</a> Facebook group. It has thousands of developers and almost all posts get a response.
|
||||
If you have an open-ended question or you just want to get a general sense of what React Native folks talk about, check out the
|
||||
{' '}
|
||||
<a
|
||||
href="https://www.facebook.com/groups/react.native.community"
|
||||
>
|
||||
React Native Community
|
||||
</a>
|
||||
{' '}
|
||||
Facebook group. It has thousands of developers and almost all posts get a response.
|
||||
</p>
|
||||
</li>
|
||||
<li className="help-list-entry">
|
||||
<h3>Reactiflux Chat</h3>
|
||||
<p>
|
||||
If you need an answer right away, check out the <a href="https://discord.gg/0ZcbPKXt5bZjGY5n">#react-native</a> channel. There are usually a number of React Native experts there who can help out or point you to somewhere you might want to look.
|
||||
If you need an answer right away, check out the
|
||||
{' '}
|
||||
<a
|
||||
href="https://discord.gg/0ZcbPKXt5bZjGY5n"
|
||||
>
|
||||
#react-native
|
||||
</a>
|
||||
{' '}
|
||||
channel. There are usually a number of React Native experts there who can help out or point you to somewhere you might want to look.
|
||||
</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
@ -120,21 +173,58 @@ var support = React.createClass({
|
|||
<li className="help-list-entry">
|
||||
<h3>Get Involved</h3>
|
||||
<p>
|
||||
If you want to contribute, take a look at the list of <a href="https://github.com/facebook/react-native/issues?q=is%3Aopen+is%3Aissue+label%3A%22Good+First+Task%22">good first tasks</a> on GitHub.
|
||||
If you want to contribute, take a look at the list of
|
||||
{' '}
|
||||
<a
|
||||
href="https://github.com/facebook/react-native/issues?q=is%3Aopen+is%3Aissue+label%3A%22Good+First+Task%22"
|
||||
>
|
||||
good first tasks
|
||||
</a>
|
||||
{' '}
|
||||
on GitHub. If you want to find out more about what other people are working on, take a look at the
|
||||
{' '}
|
||||
<a
|
||||
href="https://github.com/facebook/react-native/wiki/Roadmap"
|
||||
>
|
||||
Roadmap
|
||||
</a>
|
||||
.
|
||||
</p>
|
||||
</li>
|
||||
|
||||
<li className="help-list-entry">
|
||||
<h3>Feature Requests</h3>
|
||||
<p>
|
||||
If you have a feature request, <a href="https://react-native.canny.io/feature-requests">add it to the list</a> or upvote a similar one. The voting system helps surface which issues are most important to the community.
|
||||
If you have a feature request, <a
|
||||
href="https://react-native.canny.io/feature-requests"
|
||||
>
|
||||
add it to the list
|
||||
</a>
|
||||
{' '}
|
||||
or upvote a similar one. The voting system helps surface which issues are most important to the community.
|
||||
</p>
|
||||
</li>
|
||||
|
||||
<li className="help-list-entry">
|
||||
<h3>Report a Bug</h3>
|
||||
<p>
|
||||
If you have discovered a bug in React Native, consider submitting a <a href="https://github.com/facebook/react-native/">pull request</a> with a fix. If you don't think you can fix it yourself, you can <a href="https://github.com/facebook/react-native/issues">open an issue</a> on GitHub.
|
||||
If you have discovered a bug in React Native, consider submitting a
|
||||
{' '}
|
||||
<a
|
||||
href="https://github.com/facebook/react-native/"
|
||||
>
|
||||
pull request
|
||||
</a>
|
||||
{' '}
|
||||
with a fix. If you don't think you can fix it yourself, you can
|
||||
{' '}
|
||||
<a
|
||||
href="https://github.com/facebook/react-native/issues"
|
||||
>
|
||||
open an issue
|
||||
</a>
|
||||
{' '}
|
||||
on GitHub.
|
||||
</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
@ -145,7 +235,7 @@ var support = React.createClass({
|
|||
|
||||
</Site>
|
||||
);
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
module.exports = support;
|
||||
|
|
Loading…
Reference in New Issue