我正在使用React,react-router v3和material-ui构建一个Isomorphic应用程序.在服务器端呈现中,material-ui的一个要求是将客户端的用户代理传递给主题,因此MUI将能够相应地为其内联样式添加前缀.
最初应用程序的根组件是路由器,即在服务器端:
<RouterContext {...renderProps}/>
Run Code Online (Sandbox Code Playgroud)
在客户端:
<Router children={routes} history={browserHistory} />
Run Code Online (Sandbox Code Playgroud)
现在,由于我不知道如何将用户代理传递给RouterContext
服务器,我想出了一个(丑陋的?)解决方案:我创建了一个名为Root的无用组件,我向其传递了用户代理, Root将路由器作为他的children
,即在服务器端:
<Root userAgent={userAgent}>
<RouterContext {...renderProps}/>
</Root>
Run Code Online (Sandbox Code Playgroud)
在客户端:
<Root>
<Router children={routes} history={browserHistory} />
</Root>
Run Code Online (Sandbox Code Playgroud)
现在,一切都运作良好,但如果我不需要,我真的不喜欢创造那个无用的元素,所以我的问题是 - 有更好的方法吗?
我可以以某种方式将用户代理传递到RouterContext
服务器上,然后服务器将其传递给将创建主题的索引路由吗?
以下是有Root
兴趣的人的代码:
class Root extends React.Component {
constructor(props){
super();
this.muiTheme = getMuiTheme(customTheme, { userAgent: props.userAgent });
}
render () {
return (
<MuiThemeProvider muiTheme={this.muiTheme}>
{this.props.children}
</MuiThemeProvider>
);
}
}
Run Code Online (Sandbox Code Playgroud) 我已经阅读了有关同构应用程序开发的内容,并且我已经看到了在服务器端处理资源加载的方法.
一个是webpack-isomorphic-tools.
另一个是"hack",你在webpack中定义一个插件,它将process.env.BROWSER设置为true,并根据该变量加载资源.即:
if(process.env.BROWSER){
require('./styles.scss');
}
Run Code Online (Sandbox Code Playgroud)
我想知道,哪个更好,为什么?
node.js reactjs isomorphic-javascript webpack-isomorphic-tools
当我从另一个路径切换一条路线时,我想显示一个进度条,我找到了这个包:nprogress,用于像youtube一样的进度.
我的问题是使用React Router实现这一点.我不知何故需要NProgress.start();
在每次启动路由NProgress.done();
时执行,并在加载时执行.
有没有更好的办法(如路由变化或路由器的路由监听器之间的中间件),其他则去thorugh每条路线和做start()
的onEnter
,并且done()
对组件的DidMount()
?
我正在尝试使用react上的fetch实现客户端登录。
我正在使用护照进行身份验证。我之所以使用fetch
而不是常规的原因form.submit()
是因为我希望能够从我的Express服务器接收错误消息,例如:"username or password is wrong"
。
我知道护照可以使用flash
邮件发送回邮件,但是flash
需要进行会话,因此我想避免这种情况。
这是我的代码:
fetch('/login/local', {
method: 'POST',
headers: {
Accept: 'application/json',
'Content-Type': 'application/json',
},
body: JSON.stringify({
username: this.state.username,
password: this.state.password,
}),
}).then(res => {
console.log(res.headers.get('set-cookie')); // undefined
console.log(document.cookie); // nope
return res.json();
}).then(json => {
if (json.success) {
this.setState({ error: '' });
this.context.router.push(json.redirect);
}
else {
this.setState({ error: json.error });
}
});
Run Code Online (Sandbox Code Playgroud)
服务器发送的cookie很好,如您在chrome的dev工具上看到的:
但是chrome不会设置cookie,在“应用程序”->“ cookies”->“ localhost:8080”中:“该站点没有cookie”。
任何想法如何使其工作?
我目前正在开发一款使用Android的Android应用NotificationListenerService
,这要求用户为我的应用启用通知访问权限Setting -> Security -> Notification Access
.
我的问题是,我可以将用户重定向到这个地方,以便他们启用吗?到目前为止,我只能将它们引导到Setting -> Security
窗口.
此外,是否可以首先检查用户是否已启用我的应用程序的通知访问权限,然后才重定向它们?
我目前正在Coursera上学习课程,并使用node.js代码进行练习来计算二次表达式.所有的代码都给出了,这个练习只是为了让我们知道node.js,但我仍然遇到输入提示的问题.
代码在这里:
var quad = require('./quadratic');
var prompt = require('prompt');
prompt.get(['a', 'b', 'c'], function (err, result) {
if (err) { return onErr(err); }
console.log('Command-line input received:');
console.log('a: ' + result.a);
console.log('b: ' + result.b);
console.log('c: ' + result.c);
quad(result.a,result.b,result.c, function(err,quadsolve) {
if (err) {
console.log('Error: ', err);
}
else {
console.log("Roots are "+quadsolve.root1() + " " + quadsolve.root2());
}
});
});
Run Code Online (Sandbox Code Playgroud)
如你所见,我正在使用prompt
模块,但当我输入输入时a
,cmd正在跳过输入b
并请求我输入`c,这反过来导致错误.
如何解决这个问题,为什么会这样?
我正在开发一个视频通话应用程序(使用 react native webrtc),我想在后台维护一个打开的套接字来监听视频通话,并推送通知作为响应,以便用户可以回答。
我已经看到了这个问题,但我想知道现在是否有更好的解决方案,如果没有,我希望您能指导我使用更本机的指导解决方案,这将帮助我了解如何实现什么我想要。
谢谢。
不确定我哪里出错了。这是我的用于捆绑客户端的 webpack.prod。但有些类名没有出现在我的 html 中
const path = require('path');
const webpack = require('webpack');
const dependencies = require('./package.json');
const ManifestPlugin = require('webpack-manifest-plugin');
const CleanWebpackPlugin = require('clean-webpack-plugin');
const ExtractTextPlugin = require('extract-text-webpack-plugin');
const VENDOR_LIBS = [];
Object.entries(dependencies.dependencies).forEach(([key, value]) => {
VENDOR_LIBS.push(key);
});
const BrowserConfig = {
entry: {
bundle: './src/index',
vendor: VENDOR_LIBS,
},
output: {
path: path.resolve('./dist'),
publicPath: '/',
filename: '[name].js',
pathinfo: true,
},
resolve: {
extensions: ['.js', '.jsx', '.json', '.scss', '.css'],
},
module: {
rules: [
{
use: ['react-hot-loader/webpack', 'babel-loader'],
test: /\.(js|jsx)$/,
exclude: …
Run Code Online (Sandbox Code Playgroud) 我将首先介绍我的应用程序:简单的投票应用程序,用户可以在其中创建投票并对其进行投票。简单。
当前,我的graphql模式由用户类型,投票类型和投票类型组成,其中用户和投票通过中继连接与其投票具有一对多关系。投票类型包含对其投票者和民意调查的引用,时间戳和实际投票值。
现在,据我所知,在规范graphql列表上使用连接的优点之一是能够在边缘上存储数据(除了分页等)。我该怎么办?
如果确实可行,我的计划是摆脱投票类型,直接通过连接连接用户及其投票的民意调查,并在连接边缘存储投票值及其时间戳。
如果重要的话,选民与其民意测验之间的联系应该是双向的,即每个用户都与他的投票民意测验相连,而每个民意测验都与其选民相连。
我正在获取状态中的对象数组,并且尝试为每个对象添加一个属性。
问题是我可以看到我的属性被添加到每个对象中,但是当我映射所有这些对象并尝试console.log
它时,我得到了undefined
添加属性
addFavourites() {
let data = this.state.data.map((e) => {
e.favourite = false;
return e;
});
return data;
}
Run Code Online (Sandbox Code Playgroud)
state = {
data: []
}
Run Code Online (Sandbox Code Playgroud)
addFavourites 在这里被调用:
getItem = () => {
this.service
.mergeData()
.then((body) => {
this.setState({
data: body
},
() => {
this.addFavourites();
},
() => {
this.dataToFilter();
});
});
}
componentDidMount(){
this.getItem();
}
Run Code Online (Sandbox Code Playgroud)
在渲染功能中,我可以看到所有对象,包括最喜欢的对象
console.log(data.map((e) => e));
Run Code Online (Sandbox Code Playgroud)
但这给出了一个未定义的数组
console.log(data.map((e) => e.favourite));
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个问题?
reactjs ×6
javascript ×4
android ×2
node.js ×2
react-router ×2
arrays ×1
cookies ×1
express ×1
fetch ×1
graphql ×1
graphql-js ×1
ios ×1
json ×1
material-ui ×1
react-native ×1
relayjs ×1
socket.io ×1
webpack ×1