我正在遵循此教程:http : //reactkungfu.com/2015/07/approaches-to-testing-
react-components-an-overview/
尝试学习“浅渲染”的工作原理。
我有一个更高阶的组件:
import React from 'react';
function withMUI(ComposedComponent) {
return class withMUI {
render() {
return <ComposedComponent {...this.props}/>;
}
};
}
和一个组件:
@withMUI
class PlayerProfile extends React.Component {
render() {
const { name, avatar } = this.props;
return (
<div className="player-profile">
<div className='profile-name'>{name}</div>
<div>
<Avatar src={avatar}/>
</div>
</div>
);
}
}
和一个测试:
describe('PlayerProfile component - testing with shallow rendering', () => {
beforeEach(function() {
let {TestUtils} = React.addons;
this.TestUtils = TestUtils;
this.renderer = TestUtils.createRenderer();
this.renderer.render(<PlayerProfile name='user'
avatar='avatar'/>);
});
it('renders an Avatar', function() {
let result = this.renderer.getRenderOutput();
console.log(result);
expect(result.type).to.equal(PlayerProfile);
});
});
该result
变量保存this.renderer.getRenderOutput()
在本教程中,result.type
测试如下:
expect(result.type).toEqual('div');
就我而言,如果我登录,result
它是:
LOG: Object{type: function PlayerProfile() {..}, .. }
所以我像这样更改了测试:
expect(result.type).toEqual(PlayerProfile)
现在它给了我这个错误:
Assertion Error: expected [Function: PlayerProfile] to equal [Function: withMUI]
所以PlayerProfile
类型是高阶函数withMUI
。
PlayerProfile``withMUI
使用浅色渲染装饰,仅PlayerProfile
组件被渲染,而不是子组件。因此,我假定浅层渲染不适用于装饰的组件。
我的问题是:
为什么在本教程中为什么result.type
应该是div,但在我看来不是。
如何使用浅层渲染测试用高阶组件装饰的React组件?
你不能 首先,让我们稍微对装饰器进行除糖:
let PlayerProfile = withMUI(
class PlayerProfile extends React.Component {
// ...
}
);
withMUI返回一个不同的类,因此PlayerProfile类仅存在于withMUI的闭包中。
这是一个简化的版本:
var withMUI = function(arg){ return null };
var PlayerProfile = withMUI({functionIWantToTest: ...});
您将值传递给函数,它不会返回值,您没有值。
解决方案?保持对它的引用。
// no decorator here
class PlayerProfile extends React.Component {
// ...
}
然后,我们可以导出组件的包装版本和未包装版本:
// this must be after the class is declared, unfortunately
export default withMUI(PlayerProfile);
export let undecorated = PlayerProfile;
使用此组件的普通代码不会更改,但是您的测试将使用以下代码:
import {undecorated as PlayerProfile} from '../src/PlayerProfile';
另一种html" target="_blank">方法是将withMUI函数模拟为(x) => x
(标识函数)。这可能会导致怪异的副作用,需要在测试方面进行,因此当添加装饰器时,您的测试和源可能会不同步。
这里不使用装饰器似乎是安全的选择。
嗨,我是新来的反应本机和尝试渲染组件调用一个函数内渲染,但它似乎不工作。 我的职能: 如果我这样做,效果会更好: 但不是这个: 我不明白为什么第二个代码不起作用
问题内容: 我有一个要显示字符串数组的组件。代码看起来像这样。 运行正常。例如,如果 props.data = [‘tom’,’jason’,’chris’] 页面中呈现的结果将为 tomjasonchris 然后,我想使用逗号连接所有名称,因此我将代码更改为 但是,渲染的结果是 [Object],[Object],[Object]。 我不知道如何解释对象成为要渲染的反应组件。有什么建议吗? 问题
问题内容: 我有一个功能组件,我想强迫它重新渲染。 我该怎么办? 由于没有实例,因此我无法致电。 问题答案: 现在,使用react挂钩,您可以调用函数组件。 将返回由2个元素组成的数组: 1.一个值,表示当前状态。 2.它的二传手。用它来更新值。 通过设置器更新值将迫使您的功能组件重新呈现 , 就像这样做: 您可以在此处找到演示。 上面的组件使用了自定义的钩子函数(),该函数使用了布尔状态钩子()
问题内容: 在React JSX中,似乎无法执行以下操作: 我收到一个解析错误:意外令牌{。这不是React可以处理的吗? 我正在设计此组件,以便在内部隐藏的值将包含有效的HTML元素(h1,p等)。有什么办法可以使这项工作吗? 问题答案: 您不应该将组件子弹放在花括号中: 这是一个有效的小提琴:http : //jsfiddle.net/kb3gN/6668/ 此外,您还可以找到JSX编译器,有
问题内容: 我有一个React组件,其中有许多子组件。我不希望立即渲染子组件,而是要经过一段时间的延迟(对于每个子组件而言,它们是统一的还是不同的)。 我想知道-有没有办法做到这一点? 问题答案: 我认为最直观的方法是给孩子一个“ wait” ,在从父代传递过来的持续时间内隐藏该组件。通过将默认状态设置为隐藏,React仍会立即渲染组件,但是直到状态更改后它才可见。然后,您可以设置为调用一个函数,
问题内容: 你能告诉我如何在react js中渲染列表吗?我喜欢这样 问题答案: 您可以通过两种方式进行操作: 第一: 第二: 直接在返回中编写map函数