小编Gre*_*rel的帖子

使用React 16的"DetailedHTMLProps,HTMLDivElement>"类型中不存在属性

由于React 16现在允许自定义DOM属性,我试图在我的Typescript代码中利用它:

import * as React from 'react';

<div className="page" size="A4">
</div>
Run Code Online (Sandbox Code Playgroud)

但收到此错误消息:

错误TS2339:类型'DetailedHTMLProps <HTMLAttributes <HTMLDivElement>,HTMLDivElement>'上不存在属性'size'.

这个帖子建议做一个module augmentation,所以我尝试这样:

import * as React from 'react';

declare module 'react' {
     interface HTMLProps<T> {
        size?:string;
    }    
}
Run Code Online (Sandbox Code Playgroud)

相同的错误消息.

最后,我还尝试将其声明page为新的HTML标记:

declare global {
  namespace JSX {
    interface IntrinsicElements {
      page: any
    }
  }
}

<page className="page" size="A4">
</page>
Run Code Online (Sandbox Code Playgroud)

它消除了错误消息,但size在编译的代码中完全忽略了该属性,我最终得到:

<page className="page">
</page>
Run Code Online (Sandbox Code Playgroud)

理想情况下,最后一个是我的首选解决方案.我想在sizepage定义标记旁边使用自定义属性.

tsconfig.js

{
  "compilerOptions": {
    "outDir": "build/dist",
    "module": …
Run Code Online (Sandbox Code Playgroud)

typescript reactjs

22
推荐指数
4
解决办法
2万
查看次数

我应该记住自定义 React hook 返回的对象吗?

如果我用于useCallback自定义挂钩的方法,我是否还应该记住返回的对象?我假设它不会每次都创建一个新对象,因为它是由记忆方法和原语组成的。

export const useToggle = (args: UseToggleProps) => {
    const initialState=
        args.initialState !== undefined ? args.initialState : false
    const [active, setActive] = useState(initialState)

    const toggleOff = useCallback(() => {
        setActive(false)
    }, [])

    const toggleOn = useCallback(() => {
        setActive(true)
    }, [])

    const toggle = useCallback(() => {
        setActive((active) => !active)
    }, [])

    // Should this also be memoized with useMemo?
    return {
        active,
        toggle,
        toggleOff,
        toggleOn
    }
}
Run Code Online (Sandbox Code Playgroud)

memoization reactjs react-hooks

13
推荐指数
1
解决办法
5508
查看次数

在 Typescript 中解构函数参数

我正在尝试为以下函数的成员提供类型。 args是具有data类型属性的对象UserCreateInput

所以,从这个:

createUser(parent: any, args: any, context: any) {
    return context.prisma.createUser(args.data)
}
Run Code Online (Sandbox Code Playgroud)

我是这样写的:

createUser(parent: any, args: {data: UserCreateInput}, context: any) {
    return context.prisma.createUser(args.data)
}
Run Code Online (Sandbox Code Playgroud)

我不确定如何替换“xxx”,createUser(parent: any, xxx, context: any)所以我可以简单地返回return context.prisma.createUser(data)

types typescript

11
推荐指数
2
解决办法
8628
查看次数

React Hooks - 修改后的状态不会立即反映

我正在尝试使用React钩子将类重构为无状态组件。

组件本身非常简单,我看不出哪里出错了,因为它几乎是从 react 文档复制粘贴的。

当用户单击按钮时,组件会显示一个弹出窗口(按钮通过道具传递给我的组件)。我正在使用typescript.

我评论了在hooks版本中无法执行我想要的行

这是我的原始课程:

export interface NodeMenuProps extends PropsNodeButton {
  title?: string
  content?: JSX.Element
  button?: JSX.Element
}
export interface NodeMenuState {
  visible: boolean
}
export class NodeMenu extends React.Component<NodeMenuProps, NodeMenuState> {
  state = {
    visible: false
  }

  hide = () => {
    this.setState({
      visible: false
    })
  }

  handleVisibleChange = (visible: boolean) => {
    this.setState({ visible })
  }

  render() {        
    return (
      <div className={this.props.className}>
        <div className={styles.requestNodeMenuIcon}>
          <Popover
            content={this.props.content}
            title={this.props.title}
            trigger="click"
            placement="bottom"
            visible={this.state.visible} …
Run Code Online (Sandbox Code Playgroud)

typescript reactjs react-hooks

10
推荐指数
1
解决办法
2万
查看次数

Svelte - 每个循环中的重要中间变量

我怎样才能像在 React 中一样在 Svelte 的 HTML 中创建变量,或者这根本不是我应该如何使用 Svelte 的。我知道下面的例子很简单,但我正在考虑一种情况,我确实需要一些沉重的逻辑subArray(无法使用单行)

反应

<ul>
  {myArray.map((item) => {
    const subArray = item.items.filter(i = i > 0) // <- how can I have an intermediate variable like this in Svelte?
    return <li>{subArray.map(...)}</li>
  }}
</ul>
Run Code Online (Sandbox Code Playgroud)

斯韦尔特

<ul>
  {#each myArray as item}
    <li>
        {#each <complex-logic> as subItem}
        ...
        {/each}
    </li>
  {/each}
</ul>
Run Code Online (Sandbox Code Playgroud)

svelte svelte-component

10
推荐指数
2
解决办法
4178
查看次数

未捕获的类型错误:*** 不是 React 组件中的函数

我在 React 组件的构造函数中传递一个对象作为参数。然后,我想调用对象的函数之一,但收到此错误消息:

Uncaught TypeError: _this.layout.getWbsLayout is not a function
    at new Wbs (Wbs.tsx:50)
    at react-dom.js:4749
    at measureLifeCyclePerf (react-dom.js:4529)
    at ReactCompositeComponentWrapper._constructComponentWithoutOwner (react-dom.js:4748)
    at ReactCompositeComponentWrapper._constructComponent (react-dom.js:4734)
    at ReactCompositeComponentWrapper.mountComponent (react-dom.js:4642)
    at Object.mountComponent (react-dom.js:11542)
    at ReactCompositeComponentWrapper.performInitialMount (react-dom.js:4825)
    at ReactCompositeComponentWrapper.mountComponent (react-dom.js:4712)
    at Object.mountComponent (react-dom.js:11542)
Run Code Online (Sandbox Code Playgroud)

我在构造函数中阅读了一些关于将方法绑定到 this 的帖子,但是当我调用作为参数传递的对象的函数时,我不确定这是否适用于此,并且仍然收到类似的消息说bind is not a function.

这是我的代码,Wbs是根 React 组件,WbsLayout是我作为参数传递给 Wbs 的构造函数的对象。

错误发生在构造函数中,当我这样做时请this.layout.getWbsLayout() 注意,我尝试在其中调用该函数ComponentDidMount,但遇到了相同的错误。

import * as React from 'react';
import WbsLayout from "../layout/WbsLayout";

interface WbsProps {}
interface WbsState {
    wbsElements: …
Run Code Online (Sandbox Code Playgroud)

typescript reactjs

6
推荐指数
1
解决办法
2万
查看次数

如何使用Typescript进行cytoscape初始化?

我使用Typescript构建了一个React组件,该组件使用cytoscape(及其类型)作为无头模型。我的目标是创建一个NPM软件包,以便可以直接将其导入其他项目中。

我的图书馆:

  1. 当我将index.html中的cytoscape.js导入为静态资产时有效
  2. 当我npm install在新的es6应用中输入我的组件时不存在: Uncaught ReferenceError: cytoscape is not defined at new WbsLayout。尽管cytoscape在安装我的组件时自动安装在node_modules中。

打字稿来源

WbsLayout.tsx:

export class WbsLayout  {
    //...
    public cy: Cy.Core;
    constructor(graph: any, Options?: Options) {           
        this.cy = cytoscape({ // <-- Works or fails, see cases #1 and #2 explained above
            headless: true,
            elements: graph
        });
        //...
    }
    //...
}
Run Code Online (Sandbox Code Playgroud)

请注意,我没有import cytoscape from 'cytoscape'(或以任何类似的方式)在组件源中的任何地方,因为我似乎没有任何东西,因为用Typescript和cytoscape的类型定义方式,我不需要它来使组件正常工作用html导入的cytoscape。也许这对于NPN软件包来说是个问题...

Wbs.tsx:

一个简单的React组件,它接收道具WbsLayout。

cytoscape的类型(仅相关部分)

declare namespace Cy {
    //...
    interface Core { } …
Run Code Online (Sandbox Code Playgroud)

npm typescript cytoscape.js ecmascript-6 webpack-2

6
推荐指数
1
解决办法
1280
查看次数

获取 Typescript 中字符串文字类型的值

是否可以在 Typescript 中获取字符串文字类型的值?

type MyStringLiteral1 = 'ONE'
type MyStringLiteral2 = 'TWO'

type MyStringLiterals = MyStringLiteral1 | MyStringLiteral2

...

<div>
    // how can I get the value of MyStringLiteral1 here?
</div>

Run Code Online (Sandbox Code Playgroud)

string-literals typescript

6
推荐指数
0
解决办法
2209
查看次数

尽管在 package.json 中设置了“main”属性,Typescript 模块解析仍失败

在下面的文件夹结构中,我想以App.tsx这种方式导入我的组件:

import MyComponent from './MyComponent';
Run Code Online (Sandbox Code Playgroud)

package.json尽管我的文件设置了属性,但 Typescript 仍会抛出错误main

找不到模块“./MyComponent”`

文件夹结构:

src/
|- App.tsx
|- MyComponent/
|    |- MyComponent.tsx
|    |- package.json
|    |- ...
Run Code Online (Sandbox Code Playgroud)

我的组件.tsx:

export default class extends Component {
  ...
}
Run Code Online (Sandbox Code Playgroud)

包.json:

{
  "name": "my-component",
  "version": "0.0.0",  
  "main": "MyComponent.tsx"
}
Run Code Online (Sandbox Code Playgroud)

如果我更改MyComponent.tsx为,它会起作用,但我认为inindex.tsx的目的是完全做我正在尝试的事情。谢谢!mainpackage.json

module typescript reactjs

5
推荐指数
1
解决办法
1805
查看次数

有没有办法让 gql 标签使用 Typescript/GraphQL 自动完成?

gql使用“...”标签编写 GraphQL 查询时,有没有办法获得自动完成功能Typescript

例如,类似于在 Graphiql 中编写查询时的情况。

gql autocomplete typescript graphql

5
推荐指数
1
解决办法
5042
查看次数

Apollo 客户端 3:查询在 Chrome 的“网络”选项卡中返回结果,但在我的应用程序中未定义

我正在使用 v3 获取一些数据@apollo/client。在Chrome的网络选项卡(http结果)中,我可以看到它返回数据和错误(我并不担心该错误,我现在知道为什么会这样。):

\n
{\n    data: {workItems: [,\xe2\x80\xa6]},\xe2\x80\xa6},\n    errors: [{message: "Error trying to resolve position."\n}\n
Run Code Online (Sandbox Code Playgroud)\n

但是在我的应用程序中,data返回未定义。

\n

这是我的客户端配置:

\n
export const graphqlClient = new ApolloClient({\n    cache: new InMemoryCache(),\n    link: ApolloLink.from([\n        onError(({ graphQLErrors, networkError }) => {\n            if (graphQLErrors) {\n                graphQLErrors.forEach(error =>\n                    console.log(\n                        `[GraphQL error]: ${JSON.stringify(error, null, 2)}`\n                    )\n                )\n            }\n            if (networkError) {\n                console.log(`[Network error]: ${networkError}`)\n            }\n        }),\n        apolloLink\n    ])\n})\n
Run Code Online (Sandbox Code Playgroud)\n

我的查询:

\n
gql`\n    query WorkItems($ppm: String) {\n        workItems(where: { ppm: $ppm }) {\n            ...WorkItemKanban\n …
Run Code Online (Sandbox Code Playgroud)

react-apollo apollo-client

5
推荐指数
1
解决办法
2053
查看次数

Tailwind CSS 网格使用 JIT 和任意 grid-template-areas 样式

根据文档,Tailwind JIT(Just In Time)模式允许添加任意样式

我无法让它适用于 CSS 网格的grid-template-areas属性。在这个简单的例子中,我只想要左侧的边线,右侧的主要内容。

请注意,我有更复杂的目标,我知道我不需要 CSS 网格来实现如此简单的布局。

  • JIT 模式的工作原理是使用任意填充,例如px-[23px]Works。
  • 问题就在这里:[grid-template-areas:'sider content'],就像您转到 CSS 选项卡一样,如果未注释,则有相同的属性可以工作。

这是一个游乐场

<div class="grid [grid-template-areas:'sider content']">
  <sider class="[grid-area:sider]">SIDER</sider>
  <main class="[grid-area:content]">MAIN</main>
</div>
Run Code Online (Sandbox Code Playgroud)

css jit css-grid tailwind-css

3
推荐指数
1
解决办法
1389
查看次数