7 popular questions & answers from Working with React, React Native on StackOverflow
Here we have collected 7 Q&A about React, React Native problem.
1. How to do logging in React Native?
Answer 1:
Use console.log, console.warn etc.
As of React Native 0.29 you can simply run the following to see logs in the console:
$ react-native log-ios $ react-native log-android
Answer 2(for iOS):
console.log works.
By default on iOS, it logs to the debug pane inside Xcode.
From the IOS simulator press (⌘+D) and press Remote JS Debugging. This will open a resource, http://localhost:8081/debugger-ui on localhost. From there use Chrome Developer tools javascript console to view console.log
2. Hide keyboard in react-native.
Answer 1:
The problem with keyboard not dismissing gets more severe if you have keyboardType='numeric', as there is no way to dismiss it.
Replacing View with ScrollView is not a correct solution, as if you have multiple textInputs or buttons, tapping on them while the keyboard is up will only dismiss the keyboard.
Correct way is to encapsulate View with TouchableWithoutFeedback and calling Keyboard.dismiss()
EDIT: You can now use ScrollView with keyboardShouldPersistTaps='handled' to only dismiss the keyboard when the tap is not handled by the children (ie. tapping on other textInputs or buttons)
If you have
<View style=flex: 1> <TextInput keyboardType='numeric'/> </View>
Change it to
<ScrollView contentContainerStyle=flexGrow: 1 keyboardShouldPersistTaps='handled' > <TextInput keyboardType='numeric'/> </ScrollView>
or
import Keyboard from 'react-native' <TouchableWithoutFeedback onPress=Keyboard.dismiss accessible=false> <View style=flex: 1> <TextInput keyboardType='numeric'/> </View> </TouchableWithoutFeedback>
EDIT: You can also create a Higher Order Component to dismiss the keyboard.
import React from 'react'; import TouchableWithoutFeedback, Keyboard, View from 'react-native'; const DismissKeyboardHOC = (Comp) => return ( children, ...props ) => ( <TouchableWithoutFeedback onPress=Keyboard.dismiss accessible=false> <Comp ...props> children </Comp> </TouchableWithoutFeedback> ); ; const DismissKeyboardView = DismissKeyboardHOC(View)
Simply use it like this
... render() <DismissKeyboardView> <TextInput keyboardType='numeric'/> </DismissKeyboardView>
NOTE: the accessible=false is required to make the input form continue to be accessible through VoiceOver. Visually impaired people will thank you!
Answer 2:
This just got updated and documented! No more hidden tricks.
import Keyboard from 'react-native' // Hide that keyboard! Keyboard.dismiss()
3. Programmatically navigate using react router
Answer 1:
React Router v4
With v4 of React Router, there are three approaches that you can take to programmatic routing within components.
Use the withRouter higher-order component.
Use composition and render a <Route>
Use the context.
React Router is mostly a wrapper around the history library. history handles interaction with the browser’s window.history for you with its browser and hash histories. It also provides a memory history which is useful for environments that don’t have a global history. This is particularly useful in mobile app development (react-native) and unit testing with Node.
A history instance has two methods for navigating: push and replace. If you think of the history as an array of visited locations, push will add a new location to the array and replace will replace the current location in the array with the new one. Typically you will want to use the pushmethod when you are navigating.
In earlier versions of React Router, you had to create your own history instance, but in v4 the <BrowserRouter>, <HashRouter>, and <MemoryRouter> components will created browser, hash, and memory instances for you. React Router makes the properties and methods of the historyinstance associated with your router available through the context, under the router object.
1. Use the withRouter higher-order component
The withRouter higher-order component will inject the history object as a prop of the component. This allows you to access the push and replace methods without having to deal with the context.
import withRouter from 'react-router-dom' // this also works with react-router-native const Button = withRouter(( history ) => ( <button type='button' onClick=() => history.push('/new-location') > Click Me! </button> ))
2. Use composition and render a <Route>
The <Route> component isn’t just for matching locations. You can render a pathless route and it will always match the current location. The <Route> component passes the same props as withRouter, so you will be able to access the history methods through the history prop.
import Route from 'react-router-dom' const Button = () => ( <Route render=( history) => ( <button type='button' onClick=() => history.push('/new-location') > Click Me! </button> ) /> )
3. Use the context*
*But you probably should not
The last option is one that you should only use if you feel comfortable working with React’s contextmodel. Although context is an option, it should be stressed that context is an unstable API and React has a section Why Not To Use Context in their documentation. So use at your own risk!
const Button = (props, context) => ( <button type='button' onClick=() => // context.history.push === history.push context.history.push('/new-location') > Click Me! </button> ) // you need to specify the context type so that it // is available within the component Button.contextTypes = history: React.PropTypes.shape( push: React.PropTypes.func.isRequired )
1 and 2 are the simplest choices to implement, so for most use cases they are your best bets.
Answers 2:
React-Router 4.0.0+ Answer
In 4.0 and above, use the history as a prop of your component.
class Example extends React.Component // use `this.props.history.push('/some/path')` here ;
React-Router 3.0.0+ Answer
In 3.0 and above, use the router as a prop of your component.
class Example extends React.Component // use `this.props.router.push('/some/path')` here ;
React-Router 2.4.0+ Answer
In 2.4 and above, use a higher order component to get the router as a prop of your component.
import withRouter from 'react-router'; class Example extends React.Component // use `this.props.router.push('/some/path')` here ; // Export the decorated class var DecoratedExample = withRouter(Example); // PropTypes Example.propTypes = router: React.PropTypes.shape( push: React.PropTypes.func.isRequired ).isRequired ;
React-Router 2.0.0+ Answer
This version is backwards compatible with 1.x so there’s no need to an Upgrade Guide. Just going through the examples should be good enough.
That said, if you wish to switch to the new pattern, there’s a browserHistory module inside the router that you can access with
import browserHistory from 'react-router'
Now you have access to your browser history, so you can do things like push, replace, etc… Like:
browserHistory.push('/some/path')
Further reading: Histories and Navigation
React-Router 1.x.x Answer
I will not go into upgrading details. You can read about that in the Upgrade Guide
The main change about the question here is the change from Navigation mixin to History. Now it’s using the browser historyAPI to change route so we will use pushState() from now on.
Here’s an exemple using Mixin:
var Example = React.createClass( mixins: [ History ], navigateToHelpPage () this.history.pushState(null, `/help`); )
Note that this History comes from rackt/history project. Not from React-Router itself.
If you don’t want to use Mixin for some reason (maybe because of ES6 class), then you can access the history that you get from the router from this.props.history. It will be only accessible for the components rendered by your Router. So, if you want to use it in any child components it needs to be passed down as an attribute via props.
You can read more about the new release at their 1.0.x documentation
Here is a help page specifically about navigating outside your component
It recommends grabbing a reference history = createHistory() and calling replaceState on that.
React-Router 0.13.x Answer
I got into the same problem and could only find the solution with the Navigation mixin that comes with react-router.
Here’s how I did it
import React from 'react'; import Navigation from 'react-router'; let Authentication = React.createClass( mixins: [Navigation], handleClick(e) e.preventDefault(); this.transitionTo('/'); , render() return (<div onClick=this.handleClick>Click me!</div>); );
I was able to call transitionTo() without the need to access .context
Or you could try the fancy ES6 class
import React from 'react'; export default class Authentication extends React.Component constructor(props) super(props); this.handleClick = this.handleClick.bind(this); handleClick(e) e.preventDefault(); this.context.router.transitionTo('/'); render() return (<div onClick=this.handleClick>Click me!</div>); Authentication.contextTypes = router: React.PropTypes.func.isRequired ;
React-Router-Redux
Note: if you’re using Redux, there is another project called React-Router-Redux that gives you redux bindings for ReactRouter, using somewhat the same approach that React-Redux does
React-Router-Redux has a few methods available that allow for simple navigating from inside action creators. These can be particularly useful for people that have existing architecture in React Native, and they wish to utilize the same patterns in React Web with minimal boilerplate overhead.
Explore the following methods:
push(location)
replace(location)
go(number)
goBack()
goForward()
Here is an example usage, with Redux-Thunk:
./actioncreators.js
import goBack from 'react-router-redux' export const onBackPress = () => (dispatch) => dispatch(goBack())
./viewcomponent.js
<button disabled=submitting className="cancel_button" onClick=(e) => e.preventDefault() this.props.onBackPress() > CANCEL </button>
4. Error Running React Native App From Terminal (iOS)
Answer:
It appears to be a problem with the location of Command line tools.
In Xcode, select Xcode menu, then Preferences, then Locations tab. Select your Xcode version from the dropdown and exit Xcode.
5. React native android failed to load JS bundle
Answer 1:
To bundle JS file into your apk while having your server running (react-native start) download bundle into assets directory of your app:
curl "http://localhost:8081/index.android.bundle?platform=android" -o "android/app/src/main/assets/index.android.bundle"
With the next release (0.12) we’ll fix react-native bundle command to work with android projects as expected.
Answer 2:
The following made it work for me on Ubuntu 14.04:
cd (App Dir) react-native start > /dev/null 2>&1 & adb reverse tcp:8081 tcp:8081
6. How to add icons to React Native app
Answer 1:
iOS Icons
Set AppIcon in Images.xcassets.
Add 9 different size icons:
29pt
29pt*2
29pt*3
40pt*2
40pt*3
57pt
57pt*2
60pt*2
60pt*3.
Images.xcassets will look like this:
Android Icons
Put ic_launcher.png in folders [PrjDir]/android/app/src/main/res/mipmap-*/.
72*72 ic_launcher.png in mipmap-hdpi.
48*48 ic_launcher.png in mipmap-mdpi.
96*96 ic_launcher.png in mipmap-xhdpi.
144*144 ic_launcher.png in mipmap-xxhdpi.
192*192 ic_launcher.png in mipmap-xxxhdpi.
Answer 2:
I wrote a generator to automatically generate icons for your react native app from a single icon file: https://blog.bam.tech/developper-news/how-to-generate-your-react-native-app-icons-in-a-single-command-line.
It generates your assets and it also adds them correctly to your ios and android project.
Install it
You need node 6 installed and image-magick.
Then install the generator with
npm install -g yo generator-rn-toolbox
Use it
Have a single icon file at the ready somewhere. 200x200px is sufficient.
Then in your React Native project, run:
yo rn-toolbox:assets --icon <path to your icon> # For instance yo rn-toolbox:assets --icon ../icon.png
You will be asked for the name of your react-native project. For instance, if you created your project with react-native init MyAwesomeProject, your project name is MyAwesomeProject.
When you are asked, ? Overwrite ios/MyAwesomeProject/Images.xcassets/AppIcon.appiconset/Contents.json?, reply with Y.
And… that’s it!
7. Unable to load script from assets index.android.bundle on windows
Answer:
I’ve encountered the same issue while following the React Native tutorial (developing on Linux and targeting Android).
This issue helped me resolve the problem in following steps.
(in project directory) mkdir android/app/src/main/assets
react-native bundle --platform android --dev false --entry-file index.js --bundle-output android/app/src/main/assets/index.android.bundle --assets-dest android/app/src/main/res
react-native run-android
You can automate the above steps by placing them in scripts part of package.json like this:
"android-linux": "react-native bundle --platform android --dev false --entry-file index.js --bundle-output android/app/src/main/assets/index.android.bundle --assets-dest android/app/src/main/res && react-native run-android"
Then you can just execute npm run android-linux from your command line every time.
Thanks for reading, I hope it’ll helps you to solve the problem.
Source:
https://stackoverflow.com/q/30115372
https://stackoverflow.com/q/29685421
https://stackoverflow.com/q/39778607
https://stackoverflow.com/q/31079081
https://stackoverflow.com/q/32572399
https://stackoverflow.com/q/34329715
https://stackoverflow.com/q/44446523
Via https://reactsharing.com/7-popular-questions-answers-from-working-with-react-react-native-on-stackoverflow.html














