Closed TokenYangForever closed 6 years ago
这个错误出现的原因有很多,最常见的一种场景是:当使用UI组件进行渲染时,声明state不正确。让我们来看下下面这段在真实app中的示例代码片段。我们选取的react的代码,但是同理这种不恰当的声明在vue、Angular或其他框架中也会出现。
class Quiz extends Component { componentWillMount() { axios.get('/thedata').then(res => { this.setState({items: res.data}); }); } render() { return ( <ul> {this.state.items.map(item => <li key={item.id}>{item.name}</li> )} </ul> ); } }
这个问题修复起来也很简单。最简单的方法:在constructor里初始化时用恰当的默认值赋值给state。
class Quiz extends Component { // 在这里添加: constructor(props) { super(props); // 声明state本身,并给他的属性都设置上一个默认值 this.state = { items: [] }; } componentWillMount() { axios.get('/thedata').then(res => { this.setState({items: res.data}); }); } render() { return ( <ul> {this.state.items.map(item => <li key={item.id}>{item.name}</li> )} </ul> ); } }
<script> function init() { var myButton = document.getElementById("myButton"); var myTextfield = document.getElementById("myTextfield"); myButton.onclick = function() { var userName = myTextfield.value; } } document.addEventListener('readystatechange', function() { if (document.readyState === "complete") { init(); } }); </script>
#### 译者注: * 上面说的这个问题,是因为在html中所有资源的加载都是从上而下**同步**加载的,所以以前的代码规范都会有一句:”在html里css标签放上面,js标签放下面“;包括比如jQuery里的ready方法,这些做法都是为了保证js代码执行的时候,页面上的dom元素都是创建好了的。 * 这里我再介绍一下defer和async,在外链引入js文件的情况,可以在script标签上加上defer或async修饰符,使该**js能够异步加载**,从而解决上面遇到的问题。async表示**后续的解析任务和当前js标签的加载任务并行执行**,defer表示**该js标签的代码会在所有页面元素解析完成之后,DOMContentLoaded 事件触发之前执行**。两者具体区别参考:[https://segmentfault.com/q/1010000000640869](https://segmentfault.com/q/1010000000640869) #### 4. (unknown): Script error *
前言
这里是10大JavaScript错误:
1. Uncaught TypeError: Cannot read property
这个错误出现的原因有很多,最常见的一种场景是:当使用UI组件进行渲染时,声明state不正确。让我们来看下下面这段在真实app中的示例代码片段。我们选取的react的代码,但是同理这种不恰当的声明在vue、Angular或其他框架中也会出现。
这个问题修复起来也很简单。最简单的方法:在constructor里初始化时用恰当的默认值赋值给state。
2.TypeError: ‘undefined’ is not an object (evaluating
3. TypeError: null is not an object (evaluating