我正在编写一个脚本,根据下拉的高度和屏幕上输入的位置,将输入下移或高于输入.另外,我想根据其方向将修改器设置为下拉列表.但是setState在内部使用componentDidUpdate会创建一个无限循环(很明显)
我已经找到了getDOMNode直接使用和设置classname到dropdown 的解决方案,但我觉得使用React工具应该有更好的解决方案.有谁能够帮我?
这是工作代码的一部分getDOMNode(有点忽略定位逻辑以简化代码)
let SearchDropdown = React.createClass({
componentDidUpdate(params) {
let el = this.getDOMNode();
el.classList.remove('dropDown-top');
if(needToMoveOnTop(el)) {
el.top = newTopValue;
el.right = newRightValue;
el.classList.add('dropDown-top');
}
},
render() {
let dataFeed = this.props.dataFeed;
return (
<DropDown >
{dataFeed.map((data, i) => {
return (<DropDownRow key={response.symbol} data={data}/>);
})}
</DropDown>
);
}
});
Run Code Online (Sandbox Code Playgroud)
这里是setstate的代码(创建一个无限循环)
let SearchDropdown = React.createClass({
getInitialState() {
return {
top: false
};
},
componentDidUpdate(params) {
let el = this.getDOMNode();
if (this.state.top) {
this.setState({top: …Run Code Online (Sandbox Code Playgroud) 我正在使用 Typescript 为我的 angular 项目编写单元测试
当我尝试为某些服务创建模拟时,我使用这种方式:
const serviceMock = <IMyService>{
method: _.noop,
};
beforeEach(inject($injector => {
testingService = new AccountingService(serviceMock);
spyOn(serviceMock, 'method').and.callFake(()=>'hello');
}
Run Code Online (Sandbox Code Playgroud)
这工作正常,但是当我尝试使用时jasmine.createSpy(),出现编译错误:
const serviceMock = <IMyService>{
method: jasmine.createSpy('method').and.callFake(()=>'hello'),
};
Type '{ method: Spy;}' cannot be converted to type 'MyService'. Property 'getParams' is missing in type '{ method: Spy;}'.
Run Code Online (Sandbox Code Playgroud)
但是getParams是私有的方法MyService
我究竟做错了什么?
我们的文件结构如下
/common
/src
/componentA
/componentB
Run Code Online (Sandbox Code Playgroud)
并想使用 webpack 别名
resolve: {
alias: {
common: 'common/src'
}
}
Run Code Online (Sandbox Code Playgroud)
需要像这样的模块
require('common/componentA')
Run Code Online (Sandbox Code Playgroud)
有没有办法教 WebStorm 解决这个问题,通过导航保存选项Ctrl+Click?
ResourceRoot 选项对于这种情况没有帮助
我有服务
@Injectable()
export class MyService {
private _id: string;
get id(): string {
return this._id;
}
}Run Code Online (Sandbox Code Playgroud)
还有一个组件测试,我想模拟这个服务:
let myServiceMock = mock<MyService>(MyService);
when(myServiceMock.id).thenReturn('mockId');
TestBed.configureTestingModule({
imports: [
MyModule
],
providers: [
{
provide: MyService, useValue: instance(myServiceMock)
}
]
});Run Code Online (Sandbox Code Playgroud)
当测试运行时,我得到undefined了一个id.
是否可以通过mockito模拟吸气剂?
当在 Angular 中使用异步管道时,不会立即触发事件(http 请求或任何有延迟的可观察值),第一个值null
是为什么会发生?如何避免这种情况?
<hello [data]="delayedData$|async"> </hello>
Run Code Online (Sandbox Code Playgroud)
第一个改变:
SimpleChange {
currentValue: null
firstChange: true
previousValue: undefined
}
Run Code Online (Sandbox Code Playgroud)
第二个变化:
SimpleChange {
currentValue: 'some real data'
firstChange: false
previousValue: null
}
Run Code Online (Sandbox Code Playgroud)
stackblitz 上的示例: https://stackblitz.com/edit/http-async-pipe-crxm32
angular ×3
javascript ×2
unit-testing ×2
async-pipe ×1
ecmascript-6 ×1
jasmine ×1
reactjs ×1
rxjs ×1
typescript ×1
webpack ×1
webstorm ×1