React合成事件及Test Utilities在Facebook內(nèi)部進行測試
合成事件
boolean bubbles boolean cancelable DOMEventTarget currentTarget boolean defaultPrevented number eventPhase boolean isTrusted DOMEvent nativeEvent void preventDefault() boolean isDefaultPrevented() void stopPropagation() boolean isPropagationStopped() void persist() DOMEventTarget target number timeStamp string type
SyntheticEvent實例將傳遞給事件處理程序,它是瀏覽器本地事件的跨瀏覽器包裝器。除了與所有瀏覽器兼容外,它還具有與瀏覽器本機事件相同的接口,包括stopPropagation()和preventDefault()。 如果出于某種原因,需要使用瀏覽器的基礎事件,則只需使用nativeEvent屬性即可獲得它。
從v0.14開始,當事件處理程序返回false時,不再阻止事件氣泡。您可以選擇改用e.stopPropagation()或e.preventDefault()。 不起作用,this.state.clickEvent 的值將會只包含 null
function onClick(event) { console.log(event); // => nullified object. console.log(event.type); // => "click" const eventType = event.type; // => "click" setTimeout(function() { console.log(event.type); // => null console.log(eventType); // => "click" }, 0); this.setState({clickEvent: event}); // 你仍然可以導出事件屬性 this.setState({eventType: event.type}); }
SyntheticEvent被合并。這意味著可以重用SyntheticEvent對象,并且在調(diào)用事件回調(diào)函數(shù)后,所有屬性都將無效。出于性能原因,您不能異步訪問事件。
number pointerId number width number height number pressure number tangentialPressure number tiltX number tiltY number twist string pointerType boolean isPrimary
Test Utilities
ReactTestUtils可以與您選擇的測試框架一起使用,以便輕松測試React組件。在Facebook內(nèi)部,我們使用Jest輕松實現(xiàn)JavaScript測試。
import ReactTestUtils from 'react-dom/test-utils'; // ES6 var ReactTestUtils = require('react-dom/test-utils'); // ES5 使用 npm 的方式
act()
為斷言準備一個組件,包裝要呈現(xiàn)的代碼,并在調(diào)用act()時執(zhí)行更新。這將使測試更接近React在瀏覽器中的工作方式。
class Counter extends React.Component { constructor(props) { super(props); this.state = {count: 0}; this.handleClick = this.handleClick.bind(this); } componentDidMount() { document.title = `You clicked ${this.state.count} times`; } componentDidUpdate() { document.title = `You clicked ${this.state.count} times`; } handleClick() { this.setState(state => ({ count: state.count + 1, })); } render() { return ( <div> <p>You clicked {this.state.count} times</p> <button onClick={this.handleClick}> Click me </button> </div> ); } }
不要忘記,觸發(fā)器DOM事件僅在將DOM容器添加到文檔時生效。您可以使用React Testing Library這樣的庫來減少樣板代碼。
import React from 'react'; import ReactDOM from 'react-dom'; import { act } from 'react-dom/test-utils'; import Counter from './Counter'; let container; beforeEach(() => { container = document.createElement('div'); document.body.appendChild(container); }); afterEach(() => { document.body.removeChild(container); container = null; }); it('can render and update a counter', () => { // 首先測試 render 和 componentDidMount act(() => { ReactDOM.render(<Counter />, container); }); const button = container.querySelector('button'); const label = container.querySelector('p'); expect(label.textContent).toBe('You clicked 0 times'); expect(document.title).toBe('You clicked 0 times'); // 再測試 render 和 componentDidUpdate act(() => { button.dispatchEvent(new MouseEvent('click', {bubbles: true})); }); expect(label.textContent).toBe('You clicked 1 times'); expect(document.title).toBe('You clicked 1 times'); });
將仿真組件模塊傳遞到該方法中后,React模塊將填充有效的方法,使其成為虛擬React組件。與通常的渲染不同,組件將變成一個簡單的<div>(如果提供了mockTagName,則為其他標記),包括任何提供的子級。
scryRenderedComponentsWithType( tree, componentClass )
這個包提供了一個React渲染器,可以將React組件渲染為純JavaScript對象,而不依賴DOM或本地移動環(huán)境。 這個包的主要功能是在某個時間點返回由React DOM或React Native平臺呈現(xiàn)的視圖結(jié)構(gòu)(類似于DOM樹)的快照,而不依賴瀏覽器或jsdom。
import TestRenderer from 'react-test-renderer'; function Link(props) { return <a href={props.page}>{props.children}</a>; } const testRenderer = TestRenderer.create( <Link page="https://www.facebook.com/">Facebook</Link> ); console.log(testRenderer.toJSON());
以上就是React合成事件及Test Utilities在Facebook內(nèi)部進行測試的詳細內(nèi)容,更多關于React合成Test Utilities測試的資料請關注腳本之家其它相關文章!
相關文章
React?Native性能優(yōu)化指南及問題小結(jié)
本文將介紹在React?Native開發(fā)中常見的性能優(yōu)化問題和解決方案,包括ScrollView內(nèi)無法滑動、熱更新導致的文件引用問題、高度獲取、強制橫屏UI適配、低版本RN適配iOS14、緩存清理、navigation參數(shù)取值等,感興趣的朋友一起看看吧2024-01-01React Native模塊之Permissions權(quán)限申請的實例相機
這篇文章主要介紹了React Native模塊之Permissions權(quán)限申請的實例相機的相關資料,希望通過本文能幫助到大家,需要的朋友可以參考下2017-09-09react學習每天一個hooks?useWhyDidYouUpdate
這篇文章主要為大家介紹了react學習每天一個hooks?useWhyDidYouUpdate使用示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-04-04react-router-dom6(對比?router5)快速入門指南
這篇文章主要介紹了快速上手react-router-dom6(對比?router5),通過本文學習最新的react-router-dom?v6版本的路由知識,并且會與v5老版本進行一些對比,需要的朋友可以參考下2022-08-08