小编Gir*_*afa的帖子

Typescript React:访问组件属性类型

npm包@types/react允许我们在TypeScript应用程序中使用React.我们将组件定义为

type Props = {...}

type State = {...}

export default class MyComponent extends React.Component<Props, State> {
}
Run Code Online (Sandbox Code Playgroud)

这里我们必须声明组件props和state的类型(在类型变量中).

在我们声明了类型之后,TypeScript使用它来验证组件的使用(传递给它的props的形状).

我想围绕这样一个组件创建一个容器.容器将重用组件的props.但是为了创建具有相同道具的另一个组件,我必须再次重新声明道具的类型.或者从原始组件文件中导出它们并导入到容器中:

// original file
export type Props = {...}

// container file
import MyComponent, { Props } from './original'
Run Code Online (Sandbox Code Playgroud)

但我已经MyComponent从该文件导入了.此组件已包含有关其消耗的道具的信息(感谢类型变量React.Component).

问题是如何从组件类本身访问该信息而不显式导出/导入props的类型

我想要的东西:

import MyComponent from './MyComponent'

type Props = MyComponent.Props // <= here access the component prop types

export default class MyContainer extends React.Component<Props, {}> {}
Run Code Online (Sandbox Code Playgroud)

typescript reactjs

24
推荐指数
4
解决办法
1万
查看次数

在AngularJS中Knockout的可写计算可观察量的模拟是什么?

我在我的项目中使用KnockoutJS,但想学习AngularJS,因为它有很多Knockout没有的美味功能.所以我有兴趣使用Angular重写我的一些代码.但我不明白如何做一些我在Knockout中使用的简单事情.例如,Knockout具有计算的可观察量的特征.这很酷!我已经发现我可以使用一个简单的函数.但是Knockout为计算的observable提供了"write"函数,例如:

var first_name = ko.observable('John'),
    last_name = ko.observable('Smith'),
    full_name = ko.computed({
        read: function(){
            return first_name() + ' ' + last_name();
        },
        write: function(new_value){
            var matches = new_value.match(/^(\w+)\s+(\w+)/);

            first_name(matches[1]);
            last_name(matches[2]);
        }
    });
Run Code Online (Sandbox Code Playgroud)

JSFiddle上的这段代码:http://jsfiddle.net/Girafa/QNebV/1/

此代码允许我在更改"full_name"时更新"first_name"和"last_name"observable.如何使用AngularJS完成?检查存在参数的函数?像这样的东西?

first_name = 'John';
last_name = 'Smith';
full_name = function(value){
    if (typeof value != 'undefined')
    {
        // do the same as in the Knockout's write function
    }
    else
    {
        // do the same as in the Knockout's read function
    }
}
Run Code Online (Sandbox Code Playgroud)

什么是最佳做法?

javascript angularjs knockout.js

14
推荐指数
1
解决办法
3518
查看次数

如何在Angular 2中填充表单数组?

假设我们有一个可以包含值数组的表单.对于这种情况,Angular为我们提供了FormArray课程.

this.form = new FormGroup({
  addresses: new FormArray([]),
})
Run Code Online (Sandbox Code Playgroud)

我们也有能力使用NgForm#setValue.这可以用于填充表单,其中包含从服务器检索的一些数据.

当我从服务器接收新数据时,我想用该数据填充表单.例如,我的数据如下所示:

const data = {
  addresses: [
    { country: 'USA', city: 'New York' },
    { country: 'Germany', city: 'Berlin' },
  ]
}
Run Code Online (Sandbox Code Playgroud)

现在是时候用这些数据填充表单了.当我尝试简单地调用时,this.form.setValue(data)我收到一个错误:

Cannot set property stack of [object Object] which has only a getter
Run Code Online (Sandbox Code Playgroud)

如何使用数据填充表单,但具有以下要求:

  1. 我知道addresses财产的形状.
  2. 我不知道该data.addresses数组中的地址数量.

javascript forms angular

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

React:如何将参数传递给回调

我有一个反应组件内的元素列表,我希望它们是可点击的.点击后,我调用一些外部函数在参数中传递项目ID:

render () {
  return (
    <ul>
      {this.props.items.map(item => (
        <li key={item.id} onClick={() => {doSomething(item.id)}></li>
      ))}
    </ul>
  )
}
Run Code Online (Sandbox Code Playgroud)

这段代码有效,但它有很大的性能缺点:每次调用时都会创建许多新的匿名函数render.

如何doSomething在此处传递该功能作为参考,同时仍然可以提供item.id它?

javascript performance reactjs

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

Webpack:可以在编译时评估javascript表达式吗?

我正在尝试为我的项目设置webpack.该项目足够大,并以多种语言提供.我希望每种语言的每个入口点都作为单独的文件提供.我的语言文件不仅仅是简单的JSON,而是JavaScript.所以i18n插件不符合我的需求.

该解决方案似乎与i18n插件类似:

var languages = ['en', 'fr', 'de'];
module.exports = languages.map(function (lang) {
  return {
    name: lang,
    // some other language-dependent config
  }
})
Run Code Online (Sandbox Code Playgroud)

然后在我的一些脚本中,我想要使用环境变量来定位本地化文件:

var lang = ...; // some environment variable, available only at compile time
var l10n = require('./lang/' + lang);
Run Code Online (Sandbox Code Playgroud)

但是默认情况下,webpack尝试将该表达式存储在括号中,假设稍后在浏览器中对其进行评估.

那么有没有办法告诉webpack立即评估?

或者有人可以更好地解决我的问题?

javascript node.js bundling-and-minification webpack

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

绝对类型的 Lodash

我想lodash在保留类型的同时导入单个函数。比如这个:

import invokeMap from 'lodash/invokeMap';
Run Code Online (Sandbox Code Playgroud)

但似乎我不能这样做。编译器说没有 module lodash/invokeMap。这是正确的——绝对类型只为 声明了顶级模块lodash,所以我只能导入整个包。但我只想导入一个函数。

有没有办法只导入有关 lodash 的类型信息而不导入 lodash 本身?

以下是我的解决方案。我想使用标准的 CommonJSrequire函数来导入没有类型信息的必要函数,然后将类型转换到它上面:

declare var require;

var invokeMap: _.invokeMap = require('lodash/invokeMap');
               ^^^^^^^^^^^
               Here I want to cast proper type from DefinitelyTyped,
               but how to reach that `invokeMap` typings alone?
Run Code Online (Sandbox Code Playgroud)

typescript lodash definitelytyped

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

AWS:为同一域下的多个站点提供服务

我拥有一个域名my-portal.com。我想从 提供静态网站my-portal.com/site/a/。我想从 提供另一个静态网站my-portal.com/site/b/

如何使用 AWS 提供的资源来做到这一点?

我试图将两个网站设置为两个独立的 S3 存储桶,并启用静态网站托管,然后创建一个包含资源的 API 网关/site/a,并将/site/b其配置为 S3 网站的 HTTP 代理。

此设置在大多数情况下都可以正常工作。但是,当浏览器尝试从我的静态网站加载二进制文件(字体、图像等)时,API 网关无法正确处理该文件并以损坏的文件进行响应(因为它对二进制文件的行为很奇怪)。

我还有哪些其他方法可以达到相同的结果?

amazon-s3 amazon-web-services aws-api-gateway api-gateway

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

按值对相邻数组项进行分组的最佳方法

假设我们有一组值:

[5, 5, 3, 5, 3, 3]
Run Code Online (Sandbox Code Playgroud)

按价值和邻接对它们进行分组的最佳方法是什么?结果应如下:

[ [5,5], [3], [5], [3,3] ]
Run Code Online (Sandbox Code Playgroud)

当然,我可以循环遍历源数组并查找下一个/上一个项目,如果它们是相同的,则将它们推送到临时数组,然后将其推送到结果数组.

但我喜欢以功能方式编写代码.那么也许有更好的方法呢?

javascript arrays functional-programming

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

仅使用纯函数反转对象

假设你有一个这样的对象:

{
  a: [1,2,3],
  b: [2],
  c: [1,4]
}
Run Code Online (Sandbox Code Playgroud)

您需要将其转换为:

{
  1: ['a', 'c'],
  2: ['a', 'b'],
  3: ['a'],
  4: ['c']
}
Run Code Online (Sandbox Code Playgroud)

使用命令式方式和可变数据结构很容易做到这一点:

function convert (obj) {
  var key, values
    , result = {};

  for (key in obj) {
    values = obj[key];
    values.forEach(function (value) {
      result[value] = result[value] || []; // bad — mutability :(
      result[value].push(key); // bad — mutability :(
    });
  }

  return result;
}
Run Code Online (Sandbox Code Playgroud)

但是有没有办法只使用纯函数而不使用任何赋值来做到这一点?允许使用某些库进行函数式编程。

javascript persistence functional-programming immutability

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