├── ContactForm.js ├── ContactItem.js ├── ContactView.js ├── README.md ├── index.html ├── main.js └── style.css /ContactForm.js: -------------------------------------------------------------------------------- 1 | var ContactForm = React.createClass({ 2 | propTypes: { 3 | contact: React.PropTypes.object.isRequired 4 | }, 5 | 6 | render: function() { 7 | return ( 8 | React.createElement('form', {className: 'ContactForm'}, 9 | React.createElement('input', { 10 | type: 'text', 11 | placeholder: 'Name (required)', 12 | value: this.props.contact.name, 13 | }), 14 | React.createElement('input', { 15 | type: 'email', 16 | placeholder: 'Email', 17 | value: this.props.contact.email, 18 | }), 19 | React.createElement('textarea', { 20 | placeholder: 'Description', 21 | value: this.props.contact.description, 22 | }), 23 | React.createElement('button', {type: 'submit'}, "Add Contact") 24 | ) 25 | ) 26 | }, 27 | }); 28 | -------------------------------------------------------------------------------- /ContactItem.js: -------------------------------------------------------------------------------- 1 | var ContactItem = React.createClass({ 2 | propTypes: { 3 | name: React.PropTypes.string.isRequired, 4 | email: React.PropTypes.string, 5 | description: React.PropTypes.string, 6 | }, 7 | 8 | render: function() { 9 | return ( 10 | React.createElement('div', {className: 'ContactItem'}, 11 | React.createElement('div', {className: 'ContactItem-name'}, this.props.name), 12 | React.createElement('div', {className: 'ContactItem-email'}, this.props.email), 13 | React.createElement('div', {className: 'ContactItem-description'}, this.props.description) 14 | ) 15 | ) 16 | }, 17 | }); 18 | -------------------------------------------------------------------------------- /ContactView.js: -------------------------------------------------------------------------------- 1 | var ContactView = React.createClass({ 2 | propTypes: { 3 | contacts: React.PropTypes.array.isRequired, 4 | newContact: React.PropTypes.object.isRequired, 5 | }, 6 | 7 | render: function() { 8 | var contactItemElements = this.props.contacts 9 | .filter(function(contact) { return contact.email }) 10 | .map(function(contact) { return React.createElement(ContactItem, contact) }) 11 | 12 | return ( 13 | React.createElement('div', {className: 'ContactView'}, 14 | React.createElement('h1', {className: 'ContactView-title'}, "Contacts"), 15 | React.createElement('ul', {className: 'ContactView-list'}, contactItemElements), 16 | React.createElement(ContactForm, { 17 | contact: this.props.newContact, 18 | }) 19 | ) 20 | ) 21 | }, 22 | }); 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Learn Raw React 2 | 3 | This repository holds the solution for the final exercise of [Learn Raw React, part 1](http://jamesknelson.com/learn-raw-react-no-jsx-flux-es6-webpack/). 4 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | 5 |