Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/nicolaslopezj/react-meteor-data

Fetch Meteor data in React using decorators
https://github.com/nicolaslopezj/react-meteor-data

Last synced: 17 days ago
JSON representation

Fetch Meteor data in React using decorators

Awesome Lists containing this project

README

        

# React Meteor Data

Fetch Meteor data in React using decorators

Medium Post

- [Using decorators to fetch Meteor data in React](https://medium.com/orionsoft/using-decorators-to-fetch-meteor-data-in-react-419a6869400c)
- [Using Meteor methods on React components to fetch data](https://medium.com/orionsoft/using-meteor-methods-on-react-components-to-fetch-data-8f98431a6252)

### Installing

Install the package

```
meteor add orionsoft:react-meteor-data
```

Install the babel decorator

```
npm install --save-dev babel-plugin-transform-decorators-legacy
```

Create or update the ```.babelrc``` file in the root of your app

```js
{
"plugins": [
"babel-plugin-transform-decorators-legacy"
]
}
```

### Example with publication

```js
import React from 'react'
import {Meteor} from 'meteor/meteor'
import {withData} from 'meteor/orionsoft:react-meteor-data'
import MyCollection from './my-collection'

/**
* Prop will be checked also in the container
*/
const propTypes = {
itemId: React.PropTypes.string.isRequired,
isLoading: React.PropTypes.bool,
item: React.PropTypes.string
}

@withData(({itemId}) => {
const handler = Meteor.subscribe('myPublication', itemId)
const isLoading = !handler.ready()
const item = MyCollection.findOne(itemId)
return {isLoading, item}
})
export default class Component extends React.Component {

render () {
if (this.props.isLoading) return
return (


{this.props.item.name}

)
}

}

Component.propTypes = propTypes
```

### Example with method

```js
import React from 'react'
import {Meteor} from 'meteor/meteor'
import {withMethodData} from 'meteor/orionsoft:react-meteor-data'

/**
* Prop will be checked also in the container
*/
const propTypes = {
itemId: React.PropTypes.string.isRequired,
isLoading: React.PropTypes.bool,
item: React.PropTypes.string
}

@withMethodData(({itemId}, ready) => {
Meteor.call('getItem', itemId, ready)
})
export default class Component extends React.Component {

render () {
if (this.props.isLoading) return
return (


{this.props.item.name}

)
}

}

Component.propTypes = propTypes

// On the server
Meteor.methods({
'getItem': function (itemId) {
const item = Items.findOne(itemId)
return {item} // objects returned in the method will be passed as props
}
})
```