所以,首先是一些背景知识.我是一名原生的iOS/Android开发人员,现在正在开始我的第一个React Native项目.它带来了Javascript的所有好处和痛苦,但到目前为止我非常喜欢它:-)我还决定第一次尝试使用GraphQL.
作为一般的React环境的新手,我也没有任何关于Relay的先验知识,但是在我的创业社区的朋友和我的web-dev同事的推荐下选择了它.我也被警告过一个有点陡峭的学习曲线,但无论如何我决定继续 - 我已经在与JS和一个新的移动平台的0.xx版本进行一场艰苦的战斗,所以到底是什么,对吧?:-)我设法正确地设置了我的项目并用一个整体通过我的GQL服务器QueryRenderer,这是一个很大的安慰:-)
所以,关于问题
我很难搞清楚容器/组件的关系,以及一般的容器组成.阅读关于作文的文档有所帮助,但我仍然怀疑作文的作用QueryRenderer
QueryRenderer据说文档是每个中继树的根容器.这是否意味着QueryRenderer我们的应用程序中应该有一个root用户?或者在每个导航路径的根目录(即我们的应用程序中的选项卡)?或者仅针对每个容器组件(与表示/哑/纯组件相反,React明智)?请注意,我不是在寻找意见,而是寻求最佳实践:-)FragmentContainer(或任何其他容器)可以在没有QueryRenderer"父"组件的情况下工作吗?QueryRenderer链接到子容器?它是否获取子容器所需的所有数据的总和,然后从缓存中读取子容器,或者?如果是这样,我误解了Relay的优点 - 我们认为每个组件都可以独立于其他所有组件检索数据,并且每个组件都不了解其他组件(包括父/子组件)的数据要求).我认为这个假设也让我感到困惑QueryRenderer,并且需要一个"Root"容器.QueryRenderer是中继树的"父"/"根"中继容器,那么它如何根据它的请求呈现视图组件呢?为什么它必须有一个请求?何时以及我们应该使用QueryRenderer什么?任何帮助深表感谢 :-)
我有这样的路线
<Route path="/search" component={Search}>
Run Code Online (Sandbox Code Playgroud)
基本Search组件看起来像这样
class Search extends React.Component {
constructor (props) {
super(props)
this.state = {query: ''}
}
handleSubmit (event) {
event.preventDefault()
this.setState({query: this.refs.queryInput.value})
}
renderSearchResult() {
if (this.state.query === '')
return <EmptySearchResult />
else
return <SearchResult query={this.state.query}/>
}
render() {
return (
<div className="searchContainer">
<div className="row">
<div className="search">
<form onSubmit={event => this.handleSubmit(event)}>
<input className="searchInput" placeholder="robocop" ref="queryInput" />
</form>
</div>
</div>
<div className="row">
{this.renderSearchResult()}
</div>
</div>
)
}
}
Run Code Online (Sandbox Code Playgroud)
SearchResult 中继容器看起来像这样
class SearchResult extends React.Component {
render() …Run Code Online (Sandbox Code Playgroud) functional-programming relay react-router graphql react-router-relay
我正在尝试在打字稿文件中创建更简化的输出,*.d.ts这些输出包含在我的模块代码的捆绑版本中。这些文件是通过涉及 typescript 编译器、babel 和 rollup 的链生成的。我也使用relay和graphql,但我认为这不会对问题产生太大影响。
举个例子,在.tsx源代码中,我有这样的内容:
import { graphql } from 'babel-plugin-relay/macro'
// produces some generated code
graphql`fragment task_model on Task { id message createdAt deadline modifiers { hard medium easy } }`
// There is a generated type for this fragment, but it is a little ugly
import { task_model } from './__generated__/task.graphql'
// We can "correct" the type information and export it with a nicer name
export type Task = Readonly<Omit<task_model & { …Run Code Online (Sandbox Code Playgroud) 我正在尝试将lodash的debouncing添加到搜索函数中,从输入onChange事件调用.下面的代码生成一个类型错误'function is function',我理解,因为lodash期待一个函数.这样做的正确方法是什么,可以全部内联完成吗?到目前为止,我几乎尝试了所有的例子都无济于事.
search(e){
let str = e.target.value;
debounce(this.props.relay.setVariables({ query: str }), 500);
},
Run Code Online (Sandbox Code Playgroud) 我试图了解更复杂的graphql apis,它实现了Relay Cursor Connections Specification
如果你看一下我在github graphql api explorer上运行的查询
{
repository(owner: "getsmarter", name: "moodle-api") {
id
issues(first:2 ) {
edges {
node {
id
body
}
}
nodes {
body
}
pageInfo {
endCursor
hasNextPage
hasPreviousPage
startCursor
}
totalCount
}
}
}
Run Code Online (Sandbox Code Playgroud)
注意它有字段边和节点.
为什么github在api中有一个称为节点的附加字段?为什么他们不使用edge字段,因为你可以从边缘获得相同的数据?这只是为了方便吗?
我想构建一个Web应用程序,前端使用Javascript,后端使用C#,我想确定GraphQL的值.
现在,对于我的后端,我实现了一个示例模式,如下例所示:
public class StarWarsSchema : Schema
{
public StarWarsSchema()
{
Query = new StarWarsQuery();
}
}
Run Code Online (Sandbox Code Playgroud)
在我的前端,我现在需要以某种方式告诉Relay这个架构.至少这是我在阅读教程时所理解的,因为出于某种原因需要转换GraphQL查询.这是一个例子,我想加载所有机器人:
class Content extends React.Component<ContentProps, { }> {
...
}
export default Relay.createContainer(Content, {
fragments: {
viewer: () => Relay.QL`
fragment on User {
query HeroNameQuery {
droids {
id
name
}
}
}
`,
}
});
Run Code Online (Sandbox Code Playgroud)
在Relay的一个例子中,我看到babel-relay-plugin用于转换.它获取一个模式文件(JSON).该入门继电器的指南显示,如何建立这样的架构graphql-JS和graphql继电器JS.
现在我的问题:
我在我们的GraphQL服务器上将django-graphene与Relay一起使用。该实现在类中强加了全局ID要求,该要求覆盖并隐藏Django的ID字段。graphene.relay.Node
结果,我可以这样查询:
{
allBatches(id:"QmF0Y2hOb2RlOjE=") {
edges {
node {
id
pk
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
并获得以下响应:
{
"data": {
"allBatches": {
"edges": [
{
"node": {
"id": "QmF0Y2hOb2RlOjE=",
"pk": 1
}
}
]
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是,我失去的是能够按对象本身的原始ID(或PK)字段进行过滤的功能:
{
allBatches(id:1) {
edges {
node {
id
pk
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
实际上,我根本无法通过ID过滤对象。我可以想到两种可能的解决方法:1.防止django-graphene-relay劫持和遮蔽该id字段,也许强迫它使用其他字段名称,例如gid
2.查找一种将其包括pk为特殊字段的方法可作为属性和过滤器使用
我在1上没有取得任何进展,因为看起来django-graphene(似乎是中继标准)强加了对该字段的限制id。我看到它id已在多个地方用作魔术字符串,并且似乎没有改变字段名称的标准方法。
在2上,我可以使该属性Mixin像这样工作:
class PKMixin(object): …Run Code Online (Sandbox Code Playgroud) 使用Relay/GraphQL和Loopback的任何工作解决方案?我想我正在考虑的一些事情是如何访问数据库(因为我假设通过ORM是不可能的)以及如何在使用Relay/GraphQL时利用api生成器...
我开始使用带有反应继电器的graphQl.我遵循了一些教程,我可以在突变和查询的帮助下获取和发布.一切正常,但我的问题是,
例如:如果我从数据库中获取数据,我可以进入特定的DB/TABLE.同样,我想知道graphql存储数据的位置.
我搜索了许多网站,他们正在告诉如何使用qraphql,但我无法找到我的问题的答案.我需要澄清这方面的问题.有人可以帮我解决这个问题.
我正在遵循使用打字稿开始使用中继的示例(https://relay.dev/docs/en/quick-start-guide),它最初按预期工作。我正在尝试修改我的架构以包含一些自定义标量,因此我的架构如下所示:
scalar DateTime
type Item {
id: ID!
name:String!
created: DateTime
}
Run Code Online (Sandbox Code Playgroud)
我修改了我的relay.config.js,以便它可以编译为类型字符串
module.exports = {
\\...
customScalars: {"Date":"string"},
}
Run Code Online (Sandbox Code Playgroud)
我想将 DateTime 映射到 moment.js 中的类型,而不仅仅是我需要在每个组件中解析的字符串。在 graphql 中,我可以看到 GraphQLScalarType 类型,我可以在其中解析/序列化自定义类型,但不知道如何注册它,以便将其作为执行的一部分选取。
我找不到任何有关如何设置的文档或示例。
谢谢
relay ×10
graphql ×7
reactjs ×3
typescript ×2
asp.net-core ×1
babeljs ×1
c# ×1
debouncing ×1
django ×1
facebook ×1
javascript ×1
lodash ×1
loopback ×1
python ×1
react-router ×1
relayjs ×1
relaymodern ×1
rollupjs ×1
strongloop ×1