对象的解构赋值:
    示例代码: 对象的解构,数组的解构,以及扩展运算符…,数组使用…扩展运算符,则新对象为数组;对象使用扩展运算符,则新对象为对象;

    1. class App extends Component{
    2. constructor(props){
    3. super(props);
    4. this.state = {
    5. name: 'React & ES6',
    6. lesson: '6',
    7. teacher: {
    8. teacherName: 'David',
    9. age: 26
    10. },
    11. skills: ['Vue', 'React', 'NodeJS', 'JS', 'Angular'],
    12. friend: {
    13. name: 'Jim'
    14. }
    15. };
    16. }
    17. render(){
    18. let {
    19. name,
    20. lesson,
    21. teacher: {
    22. teacherName,
    23. age
    24. },
    25. skills: [s1, s2, s3, ...rest],
    26. friend: {
    27. name: fName
    28. }
    29. } = this.state;
    30. // rest为一个数组
    31. return (<div>
    32. <div>{name} - {lesson}</div>
    33. <div>{teacherName} - {age}</div>
    34. <div>{s1} - {s2} - {s3}</div>
    35. <div>{rest}</div>
    36. <div>{fName}</div>
    37. </div>);
    38. }
    39. }

    扩展运算符示例代码:

    1. class User extends Component {
    2. render(){
    3. let {
    4. name,
    5. age,
    6. lesson,
    7. ...rest
    8. } = this.props;
    9. return (<div {...rest}>
    10. {name} - {age} - {lesson}
    11. </div>);
    12. }
    13. }
    14. class App extends Component{
    15. constructor(props){
    16. super(props);
    17. this.state = {
    18. name: 'David',
    19. age: 26,
    20. lesson: 'React'
    21. };
    22. }
    23. render(){
    24. let {
    25. name,
    26. age,
    27. lesson
    28. } = this.state;
    29. // rest为一个数组
    30. return (<div>
    31. <User name={name} age={age} lesson={lesson} style={{color: 'red'}} onClick={(e)=> alert('Hello')}/>
    32. </div>);
    33. }
    34. }

    类的继承:

    子类中可以通过super.render() 来调用父类的render方法,来渲染父组件。

    1. class LoadingComponent extends Component {
    2. constructor(props){
    3. super(props);
    4. this.state = {
    5. loading: false
    6. };
    7. }
    8. render(){
    9. let {
    10. loading
    11. } = this.state;
    12. return (<div>
    13. {loading ? 'loading...' : ''}
    14. </div>);
    15. }
    16. showLoading(){
    17. this.setState({
    18. loading: true
    19. });
    20. }
    21. hideLoading(){
    22. this.setState({
    23. loading: false
    24. });
    25. }
    26. }
    27. class App extends LoadingComponent{
    28. render(){
    29. return (<div>
    30. {super.render()}
    31. APP
    32. </div>);
    33. }
    34. componentDidMount(){
    35. this.showLoading();
    36. setTimeout(()=>{
    37. this.hideLoading();
    38. }, 3000);
    39. }
    40. }

    Proxy:
    代码示例:

    对象的代理,示例中展示了对对象get,set的监控。

    1. let obj = new Proxy({
    2. a: 10,
    3. b: 20
    4. }, {
    5. get: function(target, key) {
    6. console.log('get key', key);
    7. return target[key] * 10;
    8. },
    9. set: function(target, key, value) {
    10. console.log('set key', key);
    11. return Reflect.set(target, key, value);
    12. }
    13. });
    14. window.obj = obj;

    控制台里测试:

    1. obj.a
    2. get key a
    3. 100
    4. obj.a = 11
    5. set key a
    6. 11
    7. obj.a
    8. get key a
    9. 110

    装饰器Decorator:
    方法装饰器: 在下面的例子中,当调用Math的add方法时,会先调用装饰器方法log。
    image.png

    组件装饰器:

    需要在User Setting里设置 “javascript.implicitProjectConfig.experimentalDecorators”: true, 来关闭warning。
    示例中的称为反向继承,组件装饰器的这种写法比继承写法更加的优雅。

    1. function loading(com){
    2. class LoadingComponent extends com{
    3. constructor(props){
    4. super(props);
    5. this.state = {
    6. loading: false
    7. };
    8. }
    9. render(){
    10. let {
    11. loading
    12. } = this.state;
    13. return (<div>
    14. {super.render()}
    15. {loading ? 'loading...' : ''}
    16. </div>);
    17. }
    18. showLoading(){
    19. this.setState({
    20. loading: true
    21. });
    22. }
    23. hideLoading(){
    24. this.setState({
    25. loading: false
    26. });
    27. }
    28. }
    29. }
    30. @loading
    31. class App extends Component{
    32. render(){
    33. return (<div>
    34. APP
    35. </div>);
    36. }
    37. componentDidMount(){
    38. this.showLoading();
    39. }
    40. }

    async,await 和promise
    示例代码: axiso是网络请求库,需要先安装。

    1. import axiso from 'axiso';
    2. class App extends Component{
    3. render(){
    4. return (<div>
    5. APP
    6. </div>);
    7. }
    8. componentDidMount(){
    9. axiso.get('http://localhost:7777/api').then((res) => {
    10. console.log(res.data);
    11. });
    12. }
    13. }

    第二种写法:

    async写在异步方法前,await 后的方法需要返回的是一个promise对象。

    1. import axiso from 'axiso';
    2. class App extends Component{
    3. render(){
    4. return (<div>
    5. APP
    6. </div>);
    7. }
    8. async componentDidMount(){
    9. let res = await axiso.get('http://localhost:7777/api');
    10. console.log(res.data);
    11. }
    12. }

    webpack在编译的时候,上面的代码会被编译成下面:
    把await后面的代码放进then里面了。

    1. import axiso from 'axiso';
    2. class App extends Component{
    3. render(){
    4. return (<div>
    5. APP
    6. </div>);
    7. }
    8. async componentDidMount(){
    9. axiso.get('http://localhost:7777/api').then(() => {
    10. console.log(res.data);
    11. });
    12. }
    13. }