小编Gab*_*bin的帖子

如何在传递 props 的同时使用 TypeScript 实现“as”props?

我正在构建一个组件库,我需要其中一些组件具有可自定义的标签名称。例如,有时看起来像 a<button>实际上是<a>。所以我希望能够像这样使用按钮组件:

<Button onClick={onClick}>Click me!</Button>
<Button as="a" href="/some-url">Click me!</Button>
Run Code Online (Sandbox Code Playgroud)

理想情况下,我希望根据“as”道具推断可用的道具:

// Throws an error because the default value of "as" is "button",
// which doesn't accept the "href" attribute.
<Button href="/some-url">Click me!<Button>
Run Code Online (Sandbox Code Playgroud)

我们可能还需要传递一个自定义组件:

// Doesn't throw an error because RouterLink has a "to" prop
<Button as={RouterLink} to="/">Click me!</Button>
Run Code Online (Sandbox Code Playgroud)

这是没有 TypeScript 的实现:

function Button({ as = "button", children, ...props }) {
  return React.createElement(as, props, children);
}
Run Code Online (Sandbox Code Playgroud)

那么,如何在传递 props 的同时使用 TypeScript 实现“as”props?

注意:我基本上是在尝试做该styled-components做的事情。但我们正在使用 CSS 模块和 SCSS,所以我无法添加样式组件。不过,我对更简单的替代方案持开放态度。

javascript typescript reactjs

15
推荐指数
1
解决办法
8197
查看次数

如何检索 React 上下文值的类型?

我使用的库上下文不导出其值的类型。它看起来是这样的:

type LocationContextObject = { /* some properties */ };

export type LocationContext = React.Context<LocationContextObject>;
Run Code Online (Sandbox Code Playgroud)

我需要访问LocationContextObject,是否可以从中提取它LocationContext

这是我所做的:

type LocationContextObject = ComponentProps<typeof LocationContext.Provider>['value'];
Run Code Online (Sandbox Code Playgroud)

它确实有效,但看起来像黑客。所以我想知道是否有更优雅的解决方案。

typescript reactjs react-context

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

gulp-ruby-sass @import在编译一个独特的文件时

我正在使用Gulp和gulp-ruby-sass来编译scss文件.该项目的文件夹如下所示:

css/
    scss/
        grid.scss
        styles.scss
    styles.css
node_modules/
    .bin/
        ...
    gulp/
        ...
    gulp-ruby-sass/
        ...
gulpfile.js
index.html
Run Code Online (Sandbox Code Playgroud)

gulpfile.js:

// Load plugins
var gulp = require( 'gulp' ),
    sass = require( 'gulp-ruby-sass' );

// Styles
gulp.task( 'styles', function () {
  return gulp.src( 'css/scss/styles.scss' )
    .pipe( sass( { style : 'compressed' } ) )
    .pipe( gulp.dest( 'css/' ) );
});
Run Code Online (Sandbox Code Playgroud)

CSS/SCSS/styles.scss:

@import 'grid';
Run Code Online (Sandbox Code Playgroud)

css/styles.css跟踪错误"要导入的文件未找到或不可读:网格".

文档建议在gulp.dest()glob中包含所有必需的.scss文件,所以我:

// Load plugins
var gulp = require( 'gulp' ),
    sass = require( 'gulp-ruby-sass' );

// Styles
gulp.task( …
Run Code Online (Sandbox Code Playgroud)

css ruby import sass gulp

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

标签 统计

reactjs ×2

typescript ×2

css ×1

gulp ×1

import ×1

javascript ×1

react-context ×1

ruby ×1

sass ×1