美文网首页
React入门(一)

React入门(一)

作者: Leonard被注册了 | 来源:发表于2019-11-14 12:45 被阅读0次

JSX(JAVASCRIPT AND XML[HTML])语法

  • ReactDOM.render([JSX],[container],[callback]):把JSX元素渲染在页面
    // 不建议把JSX直接渲染在BODY中,但是可以这么干
    ReactDOM.render(<div>Hello world!</div>,document.body, () => {
      console.log(1);
    })
    
  • JSX中的{ }存放的是JS表达式,不能直接放入对象数据类型的值(除不含对象的数组和几种特殊情况外:style设置成对象值才行,例如style={{color:'red'}}
    let obj = {name:"leonard"};
    // Uncaught Error: Objects are not valid as a React child
    ReactDOM.render(<>
        {obj}    
    </>, document.getElementById('root'));
    
  • nullundefined代表空元素,什么也不显示
    ReactDOM.render(<>
      {null}    // nothing
    </>, document.getElementById('root'))
    
  • 数组遍历(需要给创建元素设定唯一的key值)
    let arr = [10,20,30];
    ReactDOM.render(<div>
        {arr.map(item=>{
            return <span key={item}>{item}</span>
        })}   
    </div>, document.getElementById('root'));
    
  • 样式类名是className而不是class

模拟实现虚拟DOM转换为真实DOM

  • 虚拟DOM转换为真实DOM的过程
    1.基于babel-preset-react-app把JSX变为React.createElement()
    React.createElement()中的参数含义:
        第一项为标签名(或者组件名)
        第二项为给标签设置的属性,此项为空则显示为null
        第三项或者更多项:标签的子节点
    2.执行React.createElement()创建虚拟DOM对象
    3.ReactDOM.render(JSX生成的对象,容器,回调函数)把虚拟DOM对象变为真实的DOM对象(渲染到页面中)
  • 代码实现
export function createElement(type, props, ...childrens) {
    let ref, key;
    if ('ref' in props) {
        ref = props['ref'];
        props['ref'] = undefined;
    }
    if ('key' in props) {
        key = props['key'];
        props['key'] = undefined;
    }
    return {
        type,
        props: {
            ...props,
            children: childrens.length <= 1 ? (childrens[0] || '') : childrens
        },
        ref,
        key
    };
}

export function render(objJSX, container, callBack) {
    let {type, props} = objJSX,
        {children} = props;
    let newElement = document.createElement(type);
    for (let attr in props) {
        if (!props.hasOwnProperty(attr)) break;
        let value = props[attr];
        if (value == undefined) continue; // NULL OR UNDEFINED
        switch (attr.toUpperCase()) {
            case 'CLASSNAME':
                newElement.setAttribute('class', value);
                break;
            case 'STYLE':
                for (let styleAttr in value) {
                    if (value.hasOwnProperty(styleAttr)) {
                        newElement['style'][styleAttr] = value[styleAttr];
                    }
                }
                break;
            case 'CHILDREN':
                !(value instanceof Array) ? value = [value] : null;
                value.forEach((item, index) => {
                    if (typeof item === 'string') {
                        let text = document.createTextNode(item);
                        newElement.appendChild(text);
                    } else {
                        render(item, newElement);
                    }
                });
                break;
            default:
                newElement.setAttribute(attr, value);
        }
    }
    container.appendChild(newElement);
    callBack && callBack();
}

相关文章

  • react+webpack项目实际开发应用

    react+webpack项目实际开发应用 在《react入门》和《react入门提高》中我讲了,react的基础...

  • react+webpack项目实际开发应用

    react+webpack项目实际开发应用 在《react入门》和《react入门提高》中我讲了,react的基础...

  • react+webpack项目实际开发应用

    react+webpack项目实际开发应用 在《react入门》和《react入门提高》中我讲了,react的基础...

  • awesome-react-native

    React React 中文文档一定要看官方文档 React 入门实例教程阮一峰老师出品,最好的 react 入门...

  • React Native:从入门到原理

    React Native:从入门到原理 React Native:从入门到原理

  • React 实践(一)

    参考:《React 入门实例教程--阮一峰》、《React 学习教程--众成翻译》。React 框架入门学习摘录。...

  • React Native学习资料

    React 入门实例教程React-Native入门指南Flex 布局教程:语法篇React Native探索(二...

  • React Native

    JavaScript 标准参考教程(alpha)ECMAScript 6入门 React 入门实例教程React ...

  • 慕课视频

    免费 《Web安全-XSS》《ReactNative基础与入门》《React入门》《在React中使用Redux数...

  • React入门-001

    +++Categories = ["React",]Tags = ["React","入门",]date = "2...

网友评论

      本文标题:React入门(一)

      本文链接:https://www.haomeiwen.com/subject/abimbctx.html