react项目中遇到的bug

1、react-router使用时,在浏览器出错:Attempted import error: 'Link' is not exported from 'react-router

 

源代码如下: 

import React, { Component } from 'react';
import {Menu} from 'semantic-ui-react';
import 'semantic-ui-cssmantic.min.css';
import {Link} from 'react-router';


class App extends Component {
  render() {
    return (
      <div>
        <Menu pointing secondary>
          {/* 书写路由的链接 */}
          <Link></Link>
        </Menu>
        {this.props.children}
      </div>
    );
  }
}

出错原因:通常在 React 中,一般要引入两个包,react和 react-dom,那么react-routerreact-router-dom不同之处就是后者比前者多出了<Link> <BrowserRouter>这样的 DOM 类组件,因此只需引用react-router-dom这个包就OK了

 

2、在react 项目中,使用react-router,浏览器报错:

TypeError: Cannot read property 'location' of undefined
new Router

E:/exercise/react/react-app2de_modules/_react-router@4.3.1@react-router/es/Router.js:66

 

package.json中的依赖插件如下所示:

在index.js中引进路由,代码如下:

 

以下是个人见解,不保证完全正确:在项目中安装了react-router和react-router-dom,而后者后安装,这时候应该使用react-router-dom中的BrowserRouter代替react-router中的router,即在整个项目中我们只需要引进react-router-dom就可以了,不需要引进react-router,即将上面的红圈部分改成下面的形式,浏览器就不报错了:

import {BrowserRouter as Router,Route} from 'react-router-dom';

 

3、You should not use <Route component> and <Route children> in the same route; <Route children> will be ignored

在react-router-dom版本为4.x.x的时候,不能在<Route>里面在嵌套<Route>

部分代码如下:

报错原因:在react-router-dom版本为4.x.x中将component的API进行了修改,因此不能在<Route>嵌套<Route>

修改如下:

<Router>里面之所以要嵌套<div>是因为组件<Router>只能有一个子元素,所以用<div>将多个<Route>进行包裹

如果代码改成下面,就会报错:A <Router> may have only one child element

 

 

4、validateDOMNesting(...): <a> cannot appear as a descendant of <a>

大致是说在<a>标签里面不能在嵌套<a>标签

例如下面:

<a href="1">
    <a href="2"></a>
</a>

这是无效的HTML,在浏览器中会转化成下面的形式:

<a href="1"></a>
<a href="2"></a>

React的警告是说实际的DOM和virtual dom不一样,可能会存在bug,做法就是不要在<a>里面在嵌套<a>

将react-router-dom中的route和semantic-ui-react中的<Menu>结合,利用<Menu.Item>中的属性as,将as值设置为NavLink就可以实现路由跳转了

import React, { Component } from 'react';
import {Menu} from 'semantic-ui-react';
import 'semantic-ui-cssmantic.min.css';
import {NavLink} from 'react-router-dom';


class App extends Component {
  constructor(props){
    super(props);

    this.state = {
      activeItem:'home'
    };

    this.handleItemClick = this.handleItemClick.bind(this);
  }

  handleItemClick = (e, {name}) => this.setState({activeItem:name})


  render() {
    const { activeItem } = this.state;
    return (
      <div>
        <Menu pointing secondary>
          {/* 书写路由的链接 */}
          <Menu.Item as={NavLink} to='/' name="home" active={activeItem === "home"} onClick={this.handleItemClick}>
            首页
          </Menu.Item>
          <Menu.Item  as={NavLink} to='/tv' name='tv' active={activeItem === "tv"} onClick={this.handleItemClick}>
            电视
          </Menu.Item>
        </Menu>
        {this.props.children}
      </div>
    );
  }
}

export default App;

 

5、IndexRoute' is not exported from 'react-router-dom'

原因:在react-router-dom的版本为v4.x.x是没有这个组件了

 

6、在项目中安装了jquery,但是在使用$.ajax()方法的时候,报错unexpecting token

报错原因:在用ES6的模块定义组件的时候,$.ajax()方法应该放在constructor()方法里面

 

 

 

 

 

 

 

 

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在 Android 8.0 及以上版本,为了增强应用程序的安全性,Android 引入了后台限制,禁止未在前台运行的应用程序启动服务。如果您想在后台启动服务,需要使用 `startForegroundService()` 方法。这个方法会启动一个前台服务,然后你可以在服务启动后在通知栏显示一个通知,以此来告知用户服务正在运行。 以下是一个使用 `startForegroundService()` 的示例代码: ``` if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { // 创建一个 NotificationChannel NotificationChannel channel = new NotificationChannel("channel_id", "channel_name", NotificationManager.IMPORTANCE_DEFAULT); // 向系统注册 NotificationChannel NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); notificationManager.createNotificationChannel(channel); } // 创建一个 Intent,启动你的服务 Intent serviceIntent = new Intent(this, YourService.class); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { // 在 Android 8.0 及以上版本上,需要调用 startForegroundService() 方法启动服务。 startForegroundService(serviceIntent); } else { // 在 Android 8.0 以下版本上,可以直接调用 startService() 方法启动服务。 startService(serviceIntent); } ``` 注意:如果你使用的是 `startForeground()` 方法,会在 Android 8.0 及以上版本上抛出 `IllegalStateException` 异常,因为 Android 8.0 及以上版本禁止在后台启动服务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值