I think React Native works great already for many applications. Some things that are preventing it from gaining even wider applicability and adoption, I believe, are:
- ListView: no view recycling, so certain things (eg: contact views) are difficult and others (eg: feeds) use tons of memory.
- Gestures: difficult to have related gestures on a view, needs to be written monolithically right now using PanResponder.
- No high-quality, blessed solution for navigation -- this is problematic because the fragmentation leads to duplicated efforts and lots of confusion for newcomers. This is being addressed with react-navigation: github.com/facebook/react-native/wiki/Roadmap
- Many one-off native implementations of components that should just be implemented in JS. Often this is done because of some current limitation in React Native. For example: github.com/exponentjs/exponent/issues/14 -- rather than implementing a custom activity loading spinner natively, it would be better for people to find the underlying reason why they think they need to do that and resolve it. In this case it would be implementing Animated.loop and supporting
useNativeDriver: true on it. This leads to people installing tons of libraries that end up not being maintained and having many more native dependencies than they need.