在开始编写React视图库以前,要先添加react
包,这个包囊括了你在Meteor
应用中开始运行React
所须要全部东西。这个React库本身能够自动将jsx
文件编译,而且经过ReactMeteorData
的mixin加载数据。咱们将会在接下来的步骤中看到如何使用全部的这些东西。javascript
打开一个新的终端,在你运行Meteor
程序相同的文件夹下运行这样一条命令:css
meteor add react
为了启动,咱们来替换掉默认的启动应用的代码,接下来咱们会讨论这是什么意思html
首先,替换掉最开始的名为simple-todos-react.html
的HTML文件内容。java
<head> <title>Todo List</title> </head> <body> <div id="render-target"></div> </body>
而后, 删除simple-todos-react.js
并创建三个新的文件react
新建 simple-todos-react.jsx
文件写入这些内容git
if (Meteor.isClient) { // 下面的代码最会在客户端运行 Meteor.startup(function () { // 在页面加载完成以后,使用 Meteor.startup 来渲染 React 组件 React.render(<App />, document.getElementById("render-target")); }); }
新建App.jsx
文件,并写入如下内容:es6
// 不要在App前面添加 var App = React.createClass({ getTasks() { return [ { _id: 1, text: "This is task 1" }, { _id: 2, text: "This is task 2" }, { _id: 3, text: "This is task 3" } ]; }, renderTasks() { return this.getTasks().map((task) => { return <Task key={task._id} task={task} />; }); }, render() { return ( <div className="container"> <header> <h1>Todo List</h1> </header> <ul> {this.renderTasks()} </ul> </div> ); } });
新建Task.jsx
文件,并写入github
// Task 组件 - 表示单个的待作事宜 Task = React.createClass({ propTypes: { // 这个组件从React的prop中接受task并显示 // 咱们使用propTypes来表示这个属性是必须的 task: React.PropTypes.object.isRequired }, render() { return ( <li>{this.props.task.text}</li> ); } });
咱们刚刚在应用中添加的三个事情分别是如下的意思:浏览器
一个 App React组件sass
一个 Task React组件
一些包裹在 if (Meteor.isClient) { ... }
中的代码, 这些代码定义了在浏览器中会被执行,还有Meteor.startup
, 这个让程序知道页面在被加载完成以后如何去调用代码。
在教程以后,咱们会在添加和修改代码的时候参考这些组件
在咱们的浏览器中,应用将会看起来像这个样子:
Todo List
This is task1
This is task2
This is task3
若是你的应用看起来并非这样,请确认你的代码和例子上的一致
Meteor
将你的应用中的HTML文件切分并识别三个最高等级的标签:<head>, <body>,还有<template>
每一个在 <head>标签中的标签被添加到已被发送的HTML文件的head
部分,<body>标签中的全部标签一样是被添加到已被发送的HTML的body
部分,就像正常的html文件同样
每个在<template>中的标签将会被编译成Meteor
模板文件, 那些能够被包含在HTML中,包含{{>templateName}}或者是在js
中引用的Template.templateName
。在本教程中,咱们并不会使用这些Meteor特性,由于咱们将会用React定义全部的这些视图组件。
在React中,视图组件是被使用React.createClass
定义的。你的组件能够有任何你想要的方法。除了几个像是render
这样的特殊方法。组件能够接收来自于父组件经过props
属性传过来的数据。在这个教程中,咱们将看一看更多的一些React特性。你也能够经过Facebook's React tutorial来学习
在React组件中最重要的方法就是render
, 这个被React调用从应该被显示的HTML中返回内容(description),HTML内容被叫作JSX
的javascript
的扩展语言所编写。这是一种像是在javascript中写HTML的样子。你早就看出了一些明显的不一样了吧:在JSX
中,你使用className
属性代替class
,关于JSX一个重要的事情就是它(JSX)并非一种像是Spacebars
或是Angular
的模板语言 -- 它被直接编译成常规的JavaScript文件。了解更多请看React docs
若是你如今尚未尝试过下一代JavaScript特性,一些代码片断可能看起来有点怪异。这是由于.jsx
文件会随着react
包被编译,同时包含一些通用的ES2015特性,即下一代JavaScript。这些特性包含了如下的:
箭头函数:
(arg) => {return result;}
方法名简化:
render() {...}
使用const
和let
替换var
你能够阅读ecmascript README来了解Meteor所支持的特性。想要更多关于 ECMAScript 2015 的知识能够看看下面的几个文章:
在咱们作更多的将来打算以前,先来添加一些CSS来让咱们的页面好看一点儿吧。
由于本教程专一于HTML和JavaScript,因此你能够拷贝下面的代码到simple-todos.css
文件中。这是你直到本教程结束都会用到的全部CSS代码。这个应用没有这些CSS也能运行,可是你添加了这些CSS会更好看一点。
/* CSS 声明在这里 */ body { font-family: sans-serif; background-color: #315481; background-image: linear-gradient(to bottom, #315481, #918e82 100%); background-attachment: fixed; position: absolute; top: 0; bottom: 0; left: 0; right: 0; padding: 0; margin: 0; font-size: 14px; } .container { max-width: 600px; margin: 0 auto; min-height: 100%; background: white; } header { background: #d2edf4; background-image: linear-gradient(to bottom, #d0edf5, #e1e5f0 100%); padding: 20px 15px 15px 15px; position: relative; } #login-buttons { display: block; } h1 { font-size: 1.5em; margin: 0; margin-bottom: 10px; display: inline-block; margin-right: 1em; } form { margin-top: 10px; margin-bottom: -10px; position: relative; } .new-task input { box-sizing: border-box; padding: 10px 0; background: transparent; border: none; width: 100%; padding-right: 80px; font-size: 1em; } .new-task input:focus{ outline: 0; } ul { margin: 0; padding: 0; background: white; } .delete { float: right; font-weight: bold; background: none; font-size: 1em; border: none; position: relative; } li { position: relative; list-style: none; padding: 15px; border-bottom: #eee solid 1px; } li .text { margin-left: 10px; } li.checked { color: #888; } li.checked .text { text-decoration: line-through; } li.private { background: #eee; border-color: #ddd; } header .hide-completed { float: right; } .toggle-private { margin-left: 5px; } @media (max-width: 600px) { li { padding: 12px 15px; } .search { width: 150px; clear: both; } .new-task input { padding-bottom: 5px; } }
如今,你已经添加了这些CSS,这款应用应该看起来会更好一点了。切换到你的浏览器看看新的样式并确认其有没有加载成功吧~
我知道你确定想耍Sass。嘿嘿,来添加上sass吧meteor add fourseven:scss只要把simple-todos-react.css更名成simple-todos-react.scss就行了