Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

使用React在不同的DOM元素中渲染组件 #8

Open
Hancoson opened this issue Feb 13, 2017 · 0 comments
Open

使用React在不同的DOM元素中渲染组件 #8

Hancoson opened this issue Feb 13, 2017 · 0 comments
Labels

Comments

@Hancoson
Copy link
Owner

Hancoson commented Feb 13, 2017

我刚刚开始使用React。在我的项目中,我创建了一个button。当用户点击这个创建的button时候,有些复杂的字母“a”出现在页面上。

然而,在我的html中,这个字母在按钮的兄弟元素当中,下面代码是我如何解决这个渲染元素的问题。

Attempt #1

import React from 'react';
import ReactDOM from 'react-dom';

const Letter = React.createClass({
    render() {
        return (
            // lots of HTML stuff here...
        )
    }
});

var CapitalAButton = React.createClass({
    getInitialState: function(){
        return { showCapitalA: false  };
    },

    showCapitalA: function(){
        this.setState({
            showCapitalA: true
        });
    },
    
    render: function() {
	return (
	    <div id="capital-button" onClick={this.showCapitalA}>
	        A
	        { this.state.showCapitalA? ReactDOM.render(<Letter />, document.querySelector('#letter')) : null }	    
	    </div>
	)
    }
});

var ButtonChoices = React.createClass({
    render: function() {
	return (
	    <CapitalAButton />
	)
    }
});

ReactDOM.render(
    <div id="a">
        <ButtonChoices />
    </div>,
    document.querySelector('#button-group')
);

这个问题被我在45行创建。我试图创建的按钮放在了id为button-group元素当中,而不是 container 或其他,包括任何元素本身。

结果是,在27行代码,当我最后得到渲染 <Letter /> 元素的后,我告诉React找到一个不同的Dom元素并把组件写入到里面,这个Dom 为 #letter

运行后,会得到这样的结果:

"Warning: _renderNewRootComponent(): Render methods should be a pure function of props and state; triggering nested component updates from render is not allowed. If necessary, trigger nested updates in componentDidUpdate. Check the render method of CapitalAButton."

如果一个框架运行时给出这样的错误提示,我就要注意了,所以看下面……

Attempt #2

此时,最好的方法可能是设置原始组件在 container,这个组件包含这样一个事实,就是他有一个加 button-group 的id。但是我任就是在瞎搞。

我查看了一些资料关于如何实现 componentDidUpdate,如下:

生成的代码:

import React from 'react';
import ReactDOM from 'react-dom';

const Letter = React.createClass({
  render() {
	  return (
      // same html stuff ...
	  )
  } 
});

var CapitalAButton = React.createClass({
  getInitialState: function(){
	  return { showCapitalA: false  };
  },

  componentDidUpdate: function(prevProps, prevState){
	  prevState.showCapitalA? ReactDOM.unmountComponentAtNode(document.querySelector("#letter")) : ReactDOM.render(<Letter />, document.querySelector('#letter'));
  },

  toggleCapitalA: function(){
	  this.state.showCapitalA? this.setState({showCapitalA: false}) : this.setState({showCapitalA: true})
  },
  
  render: function() {
	    return (
	      <div id="capital-button" onClick={this.toggleCapitalA}>
	      A
	      </div>
	    )
    }
});

var ButtonChoices = React.createClass({
  render: function() {
	  return (
	    <CapitalAButton />
	  )
  }
});

ReactDOM.render(
    <div id="a">
        <ButtonChoices />
    </div>,
    document.querySelector('#button-group')
);

这里有许多重大的变化。首先,这个按钮有状态,用来表示字母是否可见,当用户点击这个按钮时,状态改变。

随着状态的改变触发 componentDidUpdate 监听器,切换字母的显示与否。

结论

通过这个有趣的例子学习了React中“状态”的工作,以及一些他提供的有趣的函数。我也期待着学习如何做正确的。


有很多地方可能翻译的不准确,感兴趣的同学可以查看原文>>

查看原文:地址


我的博客

@Hancoson Hancoson added the React label Apr 13, 2018
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant