摘要:用定义视图组件在中,视图组件是被使用定义的。你的组件可以有任何你想要的方法。组件可以接收来自于父组件通过属性传过来的数据。因为本教程专注于和,所以你可以拷贝下面的代码到文件中。嘿嘿,来添加上吧只要把改名成就好了
在 React 组件中定义视图
在开始编写React视图库之前,要先添加react包,这个包囊括了你在Meteor应用中开始运行React所需要所有东西。这个React库自己可以自动将jsx文件编译,并且通过ReactMeteorData的mixin加载数据。我们将会在接下来的步骤中看到如何使用所有的这些东西。
打开一个新的终端,在你运行Meteor程序相同的文件夹下运行这样一条命令:
meteor add react替换启动代码
为了启动,我们来替换掉默认的启动应用的代码,接下来我们会讨论这是什么意思
首先,替换掉最开始的名为simple-todos-react.html的HTML文件内容。
Todo List
然后, 删除simple-todos-react.js并建立三个新的文件
新建 simple-todos-react.jsx文件写入这些内容
if (Meteor.isClient) { // 下面的代码最会在客户端运行 Meteor.startup(function () { // 在页面加载完成之后,使用 Meteor.startup 来渲染 React 组件 React.render(, document.getElementById("render-target")); }); }
新建App.jsx文件,并写入以下内容:
// 不要在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; }); }, render() { return ( ); } });Todo List
{this.renderTasks()}
新建Task.jsx文件,并写入
// Task 组件 - 表示单个的待做事宜 Task = React.createClass({ propTypes: { // 这个组件从React的prop中接受task并显示 // 我们使用propTypes来表示这个属性是必须的 task: React.PropTypes.object.isRequired }, render() { return (
我们刚刚在应用中添加的三个事情分别是以下的意思:
一个 App React组件
一个 Task React组件
一些包裹在 if (Meteor.isClient) { ... } 中的代码, 这些代码定义了在浏览器中会被执行,还有Meteor.startup, 这个让程序知道页面在被加载完成之后如何去调用代码。
在教程之后,我们会在添加和修改代码的时候参考这些组件
看看结果在我们的浏览器中,应用将会看起来像这个样子:
Todo List
This is task1
This is task2
This is task3
如果你的应用看起来并不是这样,请确认你的代码和例子上的一致
HTML文件中定义静态内容Meteor将你的应用中的HTML文件切分并识别三个最高等级的标签:, ,还有
每个在
标签中的标签被添加到已被发送的HTML文件的head部分,标签中的所有标签同样是被添加到已被发送的HTML的body部分,就像正常的html文件一样每一个在中的标签将会被编译成Meteor模板文件, 那些可以被包含在HTML中,包含{{>templateName}}或者是在js中引用的Template.templateName。在本教程中,我们并不会使用这些Meteor特性,因为我们将会用React定义所有的这些视图组件。
用React定义视图组件在React中,视图组件是被使用React.createClass定义的。你的组件可以有任何你想要的方法。除了几个像是render这样的特殊方法。组件可以接收来自于父组件通过props属性传过来的数据。在这个教程中,我们将看一看更多的一些React特性。你也可以通过Facebook"s React tutorial来学习
从JSX的render方法中得到标记语言(markup)在React组件中最重要的方法就是render, 这个被React调用从应该被显示的HTML中返回内容(description),HTML内容被叫做JSX的javascript的扩展语言所编写。这是一种像是在javascript中写HTML的样子。你早就看出了一些明显的不同了吧:在JSX中,你使用className属性代替class,关于JSX一个重要的事情就是它(JSX)并不是一种像是Spacebars或是Angular的模板语言 -- 它被直接编译成常规的JavaScript文件。了解更多请看React docs
JSX文件可以使用ES2015的新特性如果你现在还没有尝试过下一代JavaScript特性,一些代码片段可能看起来有点怪异。这是因为.jsx文件会随着react包被编译,同时包含一些通用的ES2015特性,即下一代JavaScript。这些特性包含了以下的:
箭头函数:
(arg) => {return result;}
方法名简化:
render() {...}
使用const和let替换var
你可以阅读ecmascript README来了解Meteor所支持的特性。想要更多关于 ECMAScript 2015 的知识可以看看下面的几个文章:
Luke Hoban"s "ES6 features"
Kyle Simpson"s "You don"t know JS: ES6 and beyond"
Nikolas C. Zakas "Understanding ECMAScript 6"
阮一峰ES6入门
添加样式在我们做更多的未来打算之前,先来添加一些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: #ffffd; } 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。嘿嘿,来添加上sass吧
meteor add fourseven:scss
只要把simple-todos-react.css改名成simple-todos-react.scss就好了
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/86050.html
摘要:为了开启这套账户系统和界面,我们需要去添加相关的包。使用,而不是在文件加入开始这段代码只会在客户端执行加入结束添加用户关联功能现在你已经可以创建账户并登录你的应用程序了。例如包含了已登陆用户的用户名。 添加多用户账户 Meteor带来了一套账户系统然后顺便还带了用户界面来让你可以在几分钟之内在你的应用中添加多用户功能 目前,这套UI组件使用Blaze作为默认的UI引擎,在未来,可能会以...
摘要:数据存储集合是存储持久化数据的方式。中的集合比较特殊的是,它可以从服务端,包括客户端接收数据。它也可以自动的自我更新,因此一个视图组件受到一个集合的支持,他可以自动的展示最新的数据。 数据存储 集合(Collection)是Meteor存储持久化数据的方式。Meteor 中的集合比较特殊的是,它可以从服务端,包括客户端接收数据。这使得编写视图逻辑变得更加简单 -- 不用去写太多的服务端...
摘要:通过发布订阅模式过滤数据现在我们已经把应用中比较敏感的代码放到了一些方法里面,我们还需要学习安全故事的另一半内容了。当在客户端被调用时传入发布器名称,客户端将会从发布器订阅所有的数据。这个按钮应该只是给任务的所有者来显示。 通过发布订阅模式过滤数据 现在我们已经把应用中比较敏感的代码放到了一些方法里面,我们还需要学习Meteor安全故事的另一半内容了。到现在为止,我们一直是假设整个整个...
摘要:通过表单添加任务在这个步骤,我们将为用户在列表上添加输入框。在中,这是一种监听浏览器事件的方式,就像是在表单上有提交事件一样。这对一个任务列表来说并不是非常好。在下一步,我们将给待办事宜的列表添加一个非常重要的功能已完成功能和删除功能 通过表单(form)添加任务 在这个步骤,我们将为用户在列表上添加输入框。 首先,在App.jsx文件中App组件上添加表单吧。 Tod...
摘要:组件有一个名叫状态的特殊变量。将会异步地更新状态属性,然后让组件重新渲染。使其可以在为时,过滤我们已完成的任务。因为我们已经有数据在客户端的里了,所以添加额外的总数并不会向服务器再次申请数据。 在组件状态中存储临时数据 在这个步骤,我们会在为应用的客户端添加数据过滤特性,这样用户就可以通过点击’确认选框‘来查看当前进行的任务。我们会去学习如何仅在客户端使用React组件状态来存储临时模...
阅读 1752·2021-11-23 09:51
阅读 1192·2021-11-18 10:02
阅读 943·2021-10-25 09:44
阅读 2068·2019-08-26 18:36
阅读 1584·2019-08-26 12:17
阅读 1117·2019-08-26 11:59
阅读 2716·2019-08-23 15:56
阅读 3306·2019-08-23 15:05