![](/img/trans.png)
[英]How can i fix this error Invariant Violation: ViewPropTypes has been removed from React Native
[英]How to fix “Invariant violation” error in React
我正在嘗試使用React-Redux創建一個簡單的網站,以練習使用React和Redux並將它們連接起來。 整個HTML只是一個id為“ container”的div,用於在代碼末尾從ReactDOM.render接收最終組件。
// Redux
const defaultState = {
input: ""
}
const updateView = (event) => {
return {
type: "UPDATE",
input: event.target.value
}
}
const reducer = (state = defaultState, action) => {
switch(action.type) {
case "UPDATE":
return {
input: action.input
}
default:
return state
}
}
const store = Redux.createStore(reducer);
// React Redux
const connect = ReactRedux.connect;
const Provider = ReactRedux.Provider;
// React
class Presentational extends React.Component {
constructor(props) {
super(props);
this.handleChange = this.handleChange.bind(this);
}
handleChange(event) {
dispatch(this.props.submitUpdate(event));
}
render() {
return (
<div>
<textarea cols="40" rows="10" value={this.props.input} onChange={this.handleChange}/>
<div id="preview"></div>
</div>
)
}
}
const mapStateToProps = (state) => {
return {
input: state.input
}
}
const mapDispatchToProps = (dispatch) => {
return {
submitUpdate: function(event) {
dispatch(updateView(event));
}
}
}
const Container = connect(mapStateToProps, mapDispatchToProps)(Presentational);
class App extends React.Component {
constructor(props) {
super(props)
}
render() {
<Provider store={store}>
<Container/>
</Provider>
}
}
ReactDOM.render(<App />, document.getElementById("container"));
我最終希望它成為markdown預覽器,但是現在我希望它呈現一個可以鍵入的文本區域,並且在后台應更改state的input屬性,以便以后可以訪問它。 相反,它什么也不渲染並拋出:
[object Error] {
framesToPop: 1,
name: "Invariant Violation"
}
問題出在您的App
組件中。 您錯過了return
,因此默認情況下render方法返回的是undefined
,這就是導致您看到錯誤的原因。 另一個解決方法是,一旦您修復了App
組件中缺少的返回值,將刪除將給您Runttime錯誤的dispatch
。
更正后的App
組件為:
class App extends React.Component {
constructor(props) {
super(props);
}
render() {
return (
<Provider store={store}>
<Container />
</Provider>
);
}
}
並dispatch(this.props.submitUpdate(event));
應該是this.props.submitUpdate(event);
在Presentational
組件handleChange
方法中。
完整的工作代碼:
index.js
// Redux
const defaultState = {
input: ""
};
const updateView = event => {
return {
type: "UPDATE",
input: event.target.value
};
};
const reducer = (state = defaultState, action) => {
switch (action.type) {
case "UPDATE":
return {
input: action.input
};
default:
return state;
}
};
const store = Redux.createStore(reducer);
// React Redux
const connect = ReactRedux.connect;
const Provider = ReactRedux.Provider;
// React
class Presentational extends React.Component {
constructor(props) {
super(props);
this.handleChange = this.handleChange.bind(this);
}
handleChange(event) {
this.props.submitUpdate(event);
}
render() {
return (
<div>
<textarea
cols="40"
rows="10"
value={this.props.input}
onChange={this.handleChange}
/>
<div id="preview" />
</div>
);
}
}
const mapStateToProps = state => {
return {
input: state.input
};
};
const mapDispatchToProps = dispatch => {
return {
submitUpdate: function(event) {
dispatch(updateView(event));
}
};
};
const Container = connect(
mapStateToProps,
mapDispatchToProps
)(Presentational);
class App extends React.Component {
constructor(props) {
super(props);
}
render() {
return (
<Provider store={store}>
<Container />
</Provider>
);
}
}
ReactDOM.render(<App />, document.getElementById("container"));
的index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<script
crossorigin
src="https://unpkg.com/react@16/umd/react.development.js"
></script>
<script
crossorigin
src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"
></script>
<script src="https://unpkg.com/react-redux@6.0.0/dist/react-redux.js"></script>
<script src="https://unpkg.com/babel-standalone@6.15.0/babel.min.js"></script>
<script src="https://unpkg.com/redux@4.0.1/dist/redux.js"></script>
<title>Document</title>
</head>
<body>
<div id="container"></div>
<script type="text/babel" src="index.js"></script>
</body>
</html>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.