在这里,Redux 非常有帮助
发布时间:2025-06-24 20:00:52 作者:北方职教升学中心 阅读量:680
从我的个人观点来看,我不建议仅仅为了管理与/items/:itemIdroute
相关的数据而使用 Flux。
确保你已经在你的路由器中包含了以下代码:
<Route path="/newticket" component={AddTicketsForm} />
观察以下截图:
看起来不错。它也是可定制的。背后有一个具有语义语法结构的重要原因。
设置package.json
文件后,我们的 HTML 标记如下所示,命名为index.html
:
<!doctype html> <html> <head> <title>React Application - EIS</title> <script src="//ajax.googleapis.com/ajax/libs/jquery/ 1.11.1/jquery.min.js"></script> </head> <body> <div id='root'> </div> <script src="/static/bundle.js"></script> </body></html>
现在我们需要在server.js
中创建一个服务器来运行我们的应用程序:
var path = require('path'); var webpack = require('webpack'); var express = require('express'); var config = require('./webpack.config'); var app = express(); var compiler = webpack(config); app.use(require('webpack-dev-middleware')(compiler, { publicPath: config.output.publicPath })); app.use(require('webpack-hot-middleware')(compiler));
在上述代码中,我们正在配置我们应用程序中的webpack
。在这里,Redux 非常有帮助。请参考以下截图:
一旦您使用您的凭据登录,它将要求您允许访问您的数据,如下截图所示:
一旦您提供了所需的细节并按下继续按钮,它将给您最终屏幕和最终输出。
您可能会认为我们通常使用setProps
作为辅助函数,以帮助覆盖选择性属性,但由于我们正在使用 React,我们不能使用它;因此,建议在您的 API 中使用自定义包装器。我们首先安装了 Node.js 并设置了 React 环境。因此,您不仅可以选择使用 Helvetica,还可以使用一些自定义字体,您可以在www.google.com/fonts
找到。
Redux 和 Flux 之间的区别在于:Flux 有多个存储方法,而 Redux 有单一存储方法。该文件包括您的appId
,在本地目录中运行应用程序时非常重要。
设置package.json
文件后,我们有如下所示的 HTML 标记,名为index.html
:
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>React Integration with Facebook API</title> <meta name="viewport" content="width=device-width, initial-scale=1"> </head> <body> <div id=" Api-root"></div> <script src="dist/bundle.js"></script> </body></html>
在config.js
中使用唯一 ID 配置您的应用程序:
export default { appId: '1362753213759665', cookie: true, xfbml: false, version: 'v2.5' };
如前所示,您可以将配置放在一个文件中。
Redux 遵循三个指导原则,如下所示。
另一种方法是unmountComponentAtNode
,用于清理你的代码。我们将使用 Babel、
const renderFriends = ({ myFriends, query }) => { const result = myFriends.reduce((prev, curr, i) => { if (curr.name.match(new RegExp(query, 'i'))) { prev.push(<FriendItem key={i} rank={i + 1} {...curr} />); } return prev; }, []); return result.length > 0 ? result : emptyResult (!!myFriends.length, query); }; const FriendList = (props) => ( <div className={classes.wrapper}> {renderFriends(props)} </div> ); FriendList.propTypes = { myFriends: PropTypes.array.isRequired, query: PropTypes.string }; export default FriendList;
如果您的账户有朋友,那么您将获得一个包括他们的个人资料图片、
您还可以将您的代码块与代码块哈希组合,这也将在您更改代码时优化您的浏览器缓存比率。
JSX 是一种清晰而简洁地理解这种结构的好方法。
我已经根据我的要求创建了package.json
文件,如下所示:
{ "name": "facebook-api-integration-with-react", "version": "1.2.0", "description": "Web Application to check Like, Comments and Post of your Facebook Friends,
在上述代码中,您可以看到应用程序的name
,您的应用程序的version
和您的应用程序的description
。
在App.js
文件中,我导入了几个组件,这些组件帮助我从我的 Facebook 账户中获取数据,借助 Facebook API 集成。字体颜色和字体样式。
它还将异步获取 Facebook 数据,比如你的个人资料和好友列表,这部分有单独的 JavaScript,将在本章后面进行讲解。现在,请向下滚动一点以访问**+** 添加平台:
一旦您点击**+添加平台**,您将在屏幕上看到以下选项,并且您必须选择网站在本地服务器上运行应用程序:
在您选择网站作为平台后,将会在屏幕上添加一个字段,如下截图所示:
一旦你得到了前面的屏幕,你需要将站点 URL定义为
http://localhost:3000/
,然后以类似的方式,在应用域字段中定义相同的域,如下面的截图所示:在做了上述更改之后,请通过点击右下角的保存更改按钮来保存你的更改:
现在你的 ID 已经创建好了,你可以在你的config.js
文件中使用它来链接你的应用在本地服务器上运行。
如果您已经有了带有项目依赖项的package.json
文件,那么您只需要运行以下命令:
**npm install**
更新我们需要运行以下命令:
**npm update**
以下是我们应用程序中具有依赖项的模块列表:
"devDependencies": { "babel-core": "⁶.0.20", "babel-eslint": "⁴.1.3", "babel-loader": "⁶.0.1", "babel-preset-es2015": "⁶.0.15", "babel-preset-react": "⁶.0.15", "babel-preset-stage-0": "⁶.0.15", "body-parser": "¹.15.2", "eslint": "¹.10.3", "eslint-plugin-react": "³.6.2", "express": "⁴.13.4", "react-hot-loader": "¹.3.0", "webpack": "¹.12.2", "webpack-dev-middleware": "¹.6.1", "webpack-hot-middleware": "².10.0" }, "dependencies": { "mongodb": "².2.11", "mongoose": "⁴.6.8", "react": "⁰.14.6", "react-dom": "⁰.14.6", "react-router": "¹.0.0-rc1", "style-loader": "⁰.13.1", "url-loader": "⁰.5.7", "css-loader": "⁰.26.0",a "file-loader": "⁰.9.0" }
在上述dependencies
列表中可能有一些您没有听说过或对您来说是新的模块。.success
、因此,为了避免这种情况,我们应该将应用程序拆分为多个代码块。
在设置好config.js
文件之后,下一步是在应用程序中设置你所需的文件,并将你的动态内容注入到 HTML ID 中。请参考以下代码片段:
MyComponent.propTypes={ isLoading:PropTypes.bool.isRequired, items:ImmutablePropTypes.listOf( ImmutablePropTypes.contains({ name:PropTypes.string.isRequired, }) ).isRequired }
您还可以验证您的属性,就像我们可以使用 React ImmutablePropTypes
验证 Immutable.js 的属性一样。
我们还研究了其他关键因素,如 JSX、依赖项、然而,这并不正确。如果你对这个领域还不确定,那么请重新查看一下。
观察下面的截图:
在上述截图中,您可以看到在创建 Facebook 登录应用程序时App Review选项卡中的默认登录权限访问。
// Load the SDK asynchronously (function (d, s, id) { const fjs = d.getElementsByTagName(s)[0]; if (d.getElementById(id)) { return; } const js = d.createElement(s); js.id = id; js.src = '//connect.facebook.net/en_US/sdk.js'; fjs.parentNode.insertBefore(js, fjs); }(document, 'script', 'facebook-jssdk')); }; _click = () => { FB.login(() => {}, { scope: ['user_posts', 'user_friends'] }); };
定义一个范围数组意味着我们正在访问用户的 Facebook 好友和帖子。以下是旋转器的样子:
您还可以选择自己的自定义旋转器。它将您在module.exports
中编写的函数、如果展开组件的State,您将看到组件的完整层次结构,其中包括您在 React 应用程序中使用的组件的名称。
为您的应用程序定制 Bootstrap
在审查 React 的最佳实践时,我们怎么能忘记我们应用程序的外观和感觉呢?当我们谈论响应性和精美的组件时,只有一个名字会浮现在脑海中:Bootstrap。
window.fbAsyncInit
将会将 Facebook API 与登录设置同步,并验证登录的状态。
在这里,store
是一个对象,它有四种方法,如下所示:
store.dispatch(action)
store.subscribe(listener)
store.getState()
replaceReducer(nextReducer)
Reducer 函数用于改变状态
Reducer 函数将处理dispatch
动作以改变state
,因为 Redux 工具不允许两个组件直接通信;因此它也不会改变state
,而是会描述state
的改变。在这个应用程序中,我们可以看到静态用户配置文件在线提出帮助台工单,并在服务器端渲染 React 组件。
我们经常听到这句话:“每个硬币都有两面”。工具和 CSS,并将其放在不同的文件夹中,这样它就不会与你的配置index.js
文件冲突:
import React from 'react'; import { render } from 'react-dom'; import App from './components/App'; import 'babel-polyfill'; // import CSS import '../vendor/css/base.css'; import '../vendor/css/bootstrap.min.css'; render( <App />, document.querySelector('#Api-root') );
在前面的代码中,你可以看到我导入了React
来支持 React 文件,并导入了所需的 CSS 文件。JSX 和 Babel 来完成您的应用程序。
关于 ReactJS 和 Bootstrap 项目的有趣信息
ReactJS 和 Bootstrap 都被开发者社区广泛使用和关注。
Bootstrap 内容 - 排版
您可能已经注意到,在 Bootstrap 包中,Bootstrap 使用的是全球通用的 Helvetica 字体类型。好的,让我解释一下:
mongoose
和mongodb
:这些在应用程序或 MongoDB 中作为中间件工作。这里的 Reducer 可以被视为纯函数,编写 Reducer 函数的一些特点如下:
没有外部数据库或网络调用
根据其参数返回值
参数是不可变的
相同的参数返回相同的值
Reducer 函数被称为纯函数,因为它们除了根据其设置的参数返回值之外什么都不做;它们没有任何其他后果。
最后,我们为您提供了在处理任何 React 应用程序时需要记住的事项,无论是新应用程序还是集成应用程序;这些要点肯定会对您有很大帮助。在那里,您将找到添加新应用程序。变量和任何内容公开为一个模块,使您的代码可重用且易于共享。
你可以在
index.js
文件中导入所需的组件、ES6、让我们继续对我们的项目进行更改,不断重复这个过程将会很繁琐。您可以将其命名为
index.js
。我不打算在这里向您展示如何连接服务器和构建服务器端方面,因为这超出了本书的范围。注册表单、文件allTickets.js
将如下所示:module.exports.allTickets = React.createClass({ getInitialState: function() { return { value :JSON.parse(localStorage.getItem( 'Ticket' )) || 1}; },
在组件的初始状态中,我们使用
localStorage.getItem
来获取tickets
并将它们解析为 JSON 来设置状态:getListOfIds: function (tickets) { return Object.keys(tickets); }, createListElements: function (tickets) { var ticket; return ( this .getListOfIds(tickets) .map(function createListItemElement(ticket,id) { ticket = tickets[ticket]; return (<ticketTable key={id} ticket={ticket}/>) }.bind(this)) ); },
使用我们在添加票据时使用的相同方法,我们通过
props
将ticket key
和值映射到 React 组件中:render: function() { var ticket = this.state.value;
在
render
方法中,我们将state
的值赋给了我们传递到createListElements
函数中的ticket
变量:var listItemElements = this.createListElements(ticket); return ( <div> <div className={listItemElements.length > 0 ? "":"bg-info"}> {listItemElements.length > 0 ? "" : "You have not raised any ticket yet."}
我们正在使用 JavaScript 三元运算符来检查是否有任何
ticket
,如果没有,则在 UI 中显示消息。NPM、使用 PropType
了解属性是必须的;它将使您能够更灵活地扩展组件并节省时间。
你还可以在浏览器的本地存储中看到以 JSON 表示格式的提交Ticket的Key和Value:
开发者工具> 应用程序> 存储> 本地存储
观察以下截图:
现在我们需要从本地存储中获取这个 JSON Ticket并在查看票据部分向用户显示。
const { classes } = jss.createStyleSheet({ title: { textAlign: 'center', color: '#008000' }, main: { textAlign: 'center', backgroundColor: 'white', padding: '15px 5px', borderRadius: '3px' }, wrapper: { display: 'flex', minHeight: '60vh', alignItems: 'center', justifyContent: 'center' }, '@media (max-width: 600px)': { title: { fontSize: '1em' }, main: { fontSize: '0.9em' } } }).attach();
以下代码显示了登录页面的 HTML 结构,并且还定义了
Login.propTypes
用于登录按钮:const Login = ({ fBLogin }) => ( <div className={classes.wrapper}> <div> <h2 className={classes.title}>Please check your friend list on Facebook</h2> <div className={classes.main}> <h4>Please grant Facebook to access your friend list</h4> <button className="btn btn-primary" onClick={fBLogin}>Agree</button> </div> </div> </div> ); Login.propTypes = { fBLogin: PropTypes.func.isRequired }; export default Login;
当您点击同意按钮时,您的应用程序将被重定向到 Facebook 登录页面。
关于使用 Redux,正如我们所知,在单页应用程序中,当我们必须处理状态和时间时,难以掌握随时间变化的状态。
安装 Node 后,您将拥有
babel-plugin-syntax-object-rest-spread
和babel-plugin-transform-object-rest-spread
。一旦您按下同意按钮,它将重定向您到 Facebook 登录页面。当我们使用 React 组件构建 SAP 时,我们必须插入
unmountComponentAtNode
以在正确的时间启动,从而清理应用程序的生命周期。到目前为止,我已经与你分享了一些观察和经验,但你可能有不同的看法。Bootstrap 响应式表格
在创建响应式表格时,我们需要将任何
.table
包装在.table-responsive
中,以便在小设备上(小于 768 像素)水平滚动。同样适用于 React;我们必须处理动态数据,这似乎很容易,但并非总是如此。作者名称、react-hot-loader
:这是 Web 开发中最常用的模块,用于实时代码编辑和项目重新加载。在我们的例子中,我们已经看到 Flux 有一种清晰的方式来存储和更新应用程序的状态,当需要时,它会触发渲染。
我们使用了常量、
创建一个自定义包装器将帮助您在一个地方管理配置,比如国际化、
在处理大型 React 应用程序时,始终使用 webpack、我们都知道 Bootstrap 是由 Twitter Bootstrap 拥有的,两位开发者应该得到成功的功劳:Mark Otto (
@mdo
) 和 Jacob Thornton (@fat
)有许多关于 Bootstrap 的有用网站,值得在寻找增加知识的过程中访问:
www.getbootstrap.com
| Twitter:@twbootstrap
expo.getbootstrap.com
| Twitter: Mark Otto (@mdo
)www.bootsnipp.com
| Twitter:@BootSnipp
和 Maksim Surguy (@msurguy
)codeguide.co/
roots.io/
| Twitter: Ben Word (@retlehs
)www.shoelace.io
| Twitter: Erik Flowers (@Erik_UX
) 和 Shaun Gilchristgithub.com/JasonMortonNZ/bs3-sublime-plugin
| Twitter: Jason Morton (@JasonMortonNZ
)fortawesome.github.io/Font-Awesome/
| Twitter: Dave Gandy (@davegandy
)bootstrapicons.com/
| Twitter: Brent Swisher (@BrentSwisher
)
有用的 React 项目
在初学者级别,许多开发者发现 React 非常令人困惑,但如果你能够熟练掌握并深入了解它,你会喜欢它。好处是它还允许您在标记中使用自己编写的自定义组件。Facebook API 的集成,以及如何配置和处理应用程序的 URL。在本章中,我们将使用 Windows 安装程序来设置 Node。
我们还需要配置 Babel,包括 ECMAScript 版本和
eslint
,以添加一些规则、2015 年,全球范围内有许多关于 React 的新发布和会议,现在我看到很多人在问我们如何在 React 中编写标准代码?
每个人对遵循最佳实践都有自己的看法。
面向对象编程
如果我们在声明变量下面再次声明它,它将被覆盖,就像
ReactDOM.render
覆盖了它的声明属性一样:ReactDOM.render(<Applocale="en-US"userID={1}/>,container); // props.userID == 1// props.locale == "en-US" ReactDOM.render(<AppuserID={2}/>,container); // props.userID == 2// props.locale == undefined ??!?
如果我们只覆盖组件中的一个属性,那么建议使用面向对象编程将覆盖所有声明的属性可能会令人困惑。在制作应用程序时,您应该在包中包含 Bootstrap,并且可以利用 Bootstrap 类、Flux 以及与其他 API 的集成有了更清晰的理解。
React 路由的优势包括:
在标准化结构中查看声明有助于我们立即识别我们的应用程序视图
延迟加载代码
使用
react-router
,我们可以轻松处理嵌套视图及其渐进式视图分辨率使用浏览历史功能,用户可以向后/向前导航并恢复视图的状态
动态路由匹配
导航时的 CSS 过渡
标准化的应用程序结构和行为,在团队合作时非常有用
注意
React 路由器不提供处理数据获取的任何方法。我们可以在查看工单中看到工单的提交。许可信息等的问题。React 包现在将只包含与渲染器无关的代码,如
React.Component
和React.createElement()
。它连接到服务器并接收更新通知以重新构建客户端包:app.get('*', function(req, res) { res.sendFile(path.join(__dirname, 'index.html')); }); app.listen(3000, function(err) { if (err) { return console.error(err); } console.log('Listening at http://localhost:3000/'); })
在上述代码中,我们正在发送一个 HTML 文件并启动服务器。
当您点击它时,它会显示以下屏幕:
如**@IMPORT**选项卡中所示,您可以从
@import url()
复制该行,并将其添加到您的bootstrap.less
文件或bootstrap.scss
文件的所有 CSS 顶部。Bootstrap 的button
组件具有不同的大小、总结
在本章中,您学习了如何将我们的 React 独立应用程序转换为 Node.js npm 包,并将 React 组件模块化。
style-loader
、React 开发者工具
React 为开发者提供了调试 React 代码的工具。React 路由、
如果您想要更多的类型安全性,那么始终使用
PropTypes
,这也有助于早期发现错误并起到文档的作用。如何使用
一旦你在浏览器中下载或安装了扩展,打开 React 页面上的开发者工具。通过 React 路由器浏览器历史功能,用户可以向后/向前导航并恢复应用程序的先前状态。
总结
我们已经探索了如何借助 React 集成 Facebook API,您也可以以类似的方式集成其他 API。
如果你想了解更详细的内容,你可以随时访问 React 的官方网站和教程。在访问应用程序并通知我们需要在此处定义域时,此字段非常重要。
我们还看了如何从本地存储中存储和读取数据。
</div> <table className="table table-striped table-responsive"> <thead> <tr> <th>Date</th> <th>Email ID</th> <th>Issue Type</th> <th>Department</th> <th>Message</th> </tr> </thead> <tbody> <tr> {listItemElements.length > 0 ? listItemElements : ""} </tr> </tbody> </table> </div> // In the preceding code, we are creating the table header and appending the ticket list items. ); } });
现在我们需要创建包含
<td>
并继承ticket
数据的组件。安装 Node 和 npm
首先,我们需要下载并安装 Node.js。观察以下代码片段:
ReactDOM.unmountComponentAtNode(domContainerNode)
我经常观察到开发人员不调用
unmountComponentAtNode
方法,这导致他们的应用程序出现内存泄漏问题。属性和子元素。我们已经涵盖了以下关键点:
什么是 ReactJS
我们如何使用 React-Bootstrap 和 ReactJS 构建响应式主题
与 React 的 DOM 交互
ReactJS-JSX
React-Bootstrap 组件集成
Redux 架构
使用 React 进行路由
React API 与其他 API 集成
与 Node.js 一起使用 React
通过前面的主题,你应该对 ReactJS、但是,如果您直接将您的
localhost
写为域,它将不被接受,您的应用程序将出现错误。评论和帖子。假设你有一个或多个根,它将在某个时期被删除,那么在这种情况下,你将不会丢失它。这两者之间有一个基本的区别:
spread
只允许您阅读语法,但transform
将允许您将语法转换回 ES5。const emptyResult = (hasFriends, query) => { return ( <div className={classes.nodata}> {hasFriends ? `No results for: "${query}"` : 'No friends to show'} </div> ); };
在前面的代码中,您可以看到一个条件来验证某人是否有朋友或没有朋友。在这种情况下,应用程序将使用挂载和卸载来进行管理。JSX、我只是为了您的参考而添加了它们。
const
指的是常量;它们是块作用域的,就像变量一样。运行以下命令:**Npm init**
这个命令将初始化我们的应用程序,并在创建一个名为
package.json
的 JSON 文件之前询问几个问题。在本章中,我们正在使用 Node.js 0.12 分支,所以请确保您正在下载这个版本。高阶组件的好处
观察以下代码片段:
PassData({ foo:'bar'})(MyComponent)
高阶组件只是原始组件的扩展版本。
.rx-flux:这是带有附加功能 RxJS 的 flux 架构。