2016-12-01 7 views
0

Ошибка при использовании перекомпонуйте для создания Hoc withState и lifecycle:Ошибка создания Hoc с React и перекомпонуйте

warning.js?8a56:36 Warning: React.createElement: type should not be null, undefined, boolean, or number. It should be a string (for DOM elements) or a ReactClass (for composite components). Check the render method of `AppContainer`. 

Мой компонент дерева выглядит следующим образом:

export function SimpleImage(props) { 
    const { 
    src, 
    width = 200, 
    height = 200, 
    rounded, 
    circle, 
    status, 
    onLoad, 
    onFail, 
    } = props; 

    const mainWrapperStyle = style({ 
    backgroundColor: 'white', 
    backgroundSize: 'contain', 
    backgroundRepeat: 'none', 
    boxSizing: 'border-box', 
    position: 'relative', 
    width, 
    height, 
    }); 

    const roundedStyle = style({ 
    borderRadius: '10%', 
    overflow: 'hidden', 
    }); 

    const circularStyle = style({ 
    borderRadius: '50%', 
    overflow: 'hidden', 
    }); 

    const defaultImageStyle = style({ 
    opacity: 0, 
    transisition: 'opacity 150ms ease', 
    }); 

    const loadedImageStyle = style({ 
    opacity: 1, 
    }); 

    let imageStyle = defaultImageStyle; 

    let wrapperStyle = mainWrapperStyle; 
    if (rounded) { 
    wrapperStyle = merge(mainWrapperStyle, roundedStyle); 
    } else if (circle) { 
    wrapperStyle = merge(mainWrapperStyle, circularStyle); 
    } 

    if (status === LOADED) { 
    imageStyle = merge(defaultImageStyle, loadedImageStyle); 
    } 

    const image = (<img 
     {...imageStyle} 
     src={src} 
     width={width} 
     height={height} 
     role="presentation" 
     onLoad={this.onLoad} 
     onError={this.onFail} 
     />); 

    let statusIndicator = null; 
    if (this.state.status === LOADING) { 
    statusIndicator = (<LoadingIndicator />); 
    } else if (this.state.status === FAILED) { 
    statusIndicator = (<ErrorIndicator />); 
    } 

    return (<div {...wrapperStyle}> 
    {statusIndicator} 
    {image} 
    </div>); 
} 

const Image = compose(
    withState(
    'status', 
    'setStatus', 
    ({ src })=> src? LOADING: PENDING 
), 
    withProps(
    ({ setStatus }) => ({ 
    onLoad() { 
     setStatus(LOADED); 
    }, 
    onFail() { 
     setStatus(FAILED); 
    }, 
    reset() { 
     setStatus(PENDING) 
    }, 
    resetToLoading() { 
     setStatus(LOADING) 
    }, 
    })), 
    lifecycle({ 
    componentWillReceiveProps(nextProps) { 
     if(nextProps.src == null){ 
     this.props.reset(); 
     } else if(nextProps.src !== this.props.src) { 
     this.props.resetToLoading(); 
     } 
    } 
    }) 
)(SimpleImage); 
+0

Вы можете удалить код, который не имеет отношение к перекомпонуйте? Это поможет другим людям помочь вам :) – wuct

ответ

0

SimpleImage компонент до сих пор ссылки this и state, несмотря на наличие функционального компонента без гражданства. Удаление этих ссылок и замена this.onLoad на onLoad, this.onFail с onFail и изменение this.state.status с status работает правильно.

Обновленный SimpleImage компонент выглядит следующим образом:

export function SimpleImage(props) { 
    const { 
    src, 
    width = 200, 
    height = 200, 
    rounded, 
    circle, 
    status, 
    onLoad, 
    onFail, 
    } = props; 

    const mainWrapperStyle = style({ 
    backgroundColor: 'white', 
    backgroundSize: 'contain', 
    backgroundRepeat: 'none', 
    boxSizing: 'border-box', 
    position: 'relative', 
    width, 
    height, 
    }); 

    const roundedStyle = style({ 
    borderRadius: '10%', 
    overflow: 'hidden', 
    }); 

    const circularStyle = style({ 
    borderRadius: '50%', 
    overflow: 'hidden', 
    }); 

    const defaultImageStyle = style({ 
    opacity: 0, 
    transisition: 'opacity 150ms ease', 
    }); 

    const loadedImageStyle = style({ 
    opacity: 1, 
    }); 

    let imageStyle = defaultImageStyle; 

    let wrapperStyle = mainWrapperStyle; 
    if (rounded) { 
    wrapperStyle = merge(mainWrapperStyle, roundedStyle); 
    } else if (circle) { 
    wrapperStyle = merge(mainWrapperStyle, circularStyle); 
    } 

    if (status === LOADED) { 
    imageStyle = merge(defaultImageStyle, loadedImageStyle); 
    } 

    debugger 
    const image = (<img 
     {...imageStyle} 
     src={src} 
     width={width} 
     height={height} 
     role="presentation" 
     onLoad={onLoad} 
     onError={onFail} 
     />); 

    let statusIndicator = null; 
    if (status === LOADING) { 
    statusIndicator = (<LoadingIndicator />); 
    } else if (status === FAILED) { 
    statusIndicator = (<ErrorIndicator />); 
    } 

    return (<div {...wrapperStyle}> 
    {statusIndicator} 
    {image} 
    </div>); 
}