Rails5.1增加了Webpacker:

Webpacker essentially is the decisions made by the Rails team and bundled up into a gem.

Webpacker帮我们做好了几乎所以配置工作,我们只需要聚焦在写Js上。

React :

React is a JavaScript view library designed to quickly create dynamic user interfaces.



Chapter13 使用Webpacker and React 做一个动态的用户界面。

  1. Configuring Webpacker and Installing React。
  2. Replace our existing payment-type drop-down with a React-rendered version.

初次安装步骤: (5.1教程安装步骤不能使用React)

brew install yarn

gem install "webpacker'

bundle install

❌rails webpacker:install❌,不要用,看git上的说明:

我在https://github.com/rails/webpacker 从新安装。

# Available Rails 5.1+
rails new myapp --webpack=react
# Gemfile
gem 'webpacker', '~> 3.4'
bundle
bundle exec rails webpacker:install 
rails webpacker:install:react
之后重新启动服务器,在orders/new.html.erb加a helper method 代码:
<%= javascript_pack_tag("hello_react") %>
成功在browser上显示!证明Webpack的internals成功在app上运行了.

---- -------------------------------

创建了配置文件在config/webpack 中,并安装了js 库。 js库列表在package.json中(类似于gemfile)。

类似于bundle install,yarn install下载所有必要的js库。不过因为约定,webpacker:install已经替我们运行了yarn install。

Webpacker可以安装配置主流的js框架(Vue,React,Angulaer)


Updating Our Development Environment for Webpack

app/javascript/packs ,  在这个目录中有一个hello_react.jsx, 里面注释让程序员进行测试,看是否能够正常使用。帮助方法:javascript_pack_tag。

//Run this example by adding <%= javascript_pack_tag 'hello_react' %> to the head of your layout file, like app/views/layouts/application.html.erb. All it does is render <div>Hello React</div> at the bottom of the page.

因为需求和效能,Rails 不简单的把全部js加入 。

Webpacker允许我们独立的管理一堆packs。所以只把需要的功能加入。


Learning Just Enough React先学习需要的React知识点

React是什么?

is a view library for JavaScript. Like the erb files we've been using. React dynamically renders HTML. Unlike ERB, React does this in the browser,

and it is optimized (优化的)to do it fast.

不光是 一个api 函数库,也是一个迷你框架,它的扩展功能让工作更容易。

React是组件,一个组件是一个视图,基于背后的状态。当状态变化,视图就渲染。视图的渲染是基于状态内部的组件。

对我们来说,我们根据当前选择框,让我们的视图渲染不同的input tags。

我们可以用js api完成这个功能。但代码过于冗长,难以跟随和维护。于是出现了JSX 。

hello_react.jsx中的 jsx 是什么,有什么用?

这个格式内部混合了js code 和 类html标记 在一个文件中,更方便的使用React components组件。

React 提供了一个编译器,把JSX编译成JS, Webpack可以使用这个编译器。


Creating a React-Powered Drop-Down

  1. 创建一个新pack
  2. 创建PayTypeSelector component, 用来取代传统的selector: dropdown
  3. 通过使用javascript_pack_tag和React相关的标记语言,把这个组件带入核对视图。
1.Creating a New Pack

在javascript/packs中新建文件pay_type.jsx。这个文件的代码用来引导React 组件放在合适的位置。

最直接的方法:定位一个element in the DOM, 使用React.render方法,把组件渲染进这个元素。

详解:

import React from 'react'

#类似Ruby中的require  ,使用React 库

import ReactDOM from 'react-dom'

#ReactDom对象,有用来渲染我们使用的React组件的render function

import PayTypeSelector from 'PayTypeSelector'
#自建的选择器,是我们之后用的组件。
document.addEventListener('turbolinks:load', function() { 	var element = document.getElementById("pay-type-component"); ReactDOM.render(<PayTypeSelector />, element); 
});
# 使用标准函数addEventListener确保我们将执行的代码在全部DOM加载之后运行,
# turbolinks:load 确保React每次页面被渲染后建立,如果用DOMContentLoaded,在导航到其他页面后,在使用后退按钮返回这个页面,这个页面的React不会正常工作。

# var element 是定位的元素,用js方法得到id。

# ReactDOM.render 看起来很怪异,它的作用是用React组件PayTypeSelector取代element. <PayTypeSelector />

2 Creating the PayTypeSelector Component
建立app/javascript/PayTypeSelector/index.jsx
This file will contain a React component that renders the exact same HTML for the pay type drop-down as our current Rails view.

在我们import PayTypeSelector时,Webpack将加载这个文件index.jsx

A React 组件是一个类,扩展了React.Component, 并有一个render方法用来返回组件的视图。最新版的js 支持创建类和方法。

这个文件是标准的xml,和html有区别,如className htmlFor,在html是class和for,这里需要看React文档。

import React from "react"
class PayTypeSelector extends React.Component { 

#注意大小写一个字都不能❌,否则报告❌,而且找不到。

  render() {
    return (
      <div className="field">
        <label htmlFor="order_pay_type">Paytype</label>
        <select id="pay_type" name="order[pay_type]">

//name的值作为select,和Rails form helper一样。这样控制器就可以找到这个value

          <option value="">Select a payment</option>
          <option value="Check">Check</option>
          <option value="Credit card">Credit card</option>
          <option value="Purchase order">Purchase</option>
        </select>
      </div>
    );
  }
}
export default PayTypeSelector   
//在JS中,必须明确声明要从你的文件中输出什么类,这里默认输出PayTypeSelector。

这里是export default <class>

3 Bring the PayTypeSelector Component into the Rails View 

class PayTypeSelector extends React.Component {
  onPayTypeSelected(event) {
    console.log(event.target.value);
  };

...

<select onChange={this.onPayTypeSelected} name="order[pay_type]">

在chrome的检查器console中,当state变化时,通过调用组件的render方法,view被渲染。

替换console.log代码为:this.setState({ selectedPayType: event.target.value});


Dynamically Replacing Components Based on User Actions

第一步:

在index.jsx中 ,对select元素加上属性onChange= {} ,⚠️使用了{},不用"",这是JSX的特点。

html和react的一些区别:

https://reactjs.org/docs/dom-elements.html DOM属性用驼峰写法tabIndex

这个方法的定义:
onPayTypeSelected(event) {
this.setState({ selectedPayType: event.target.value });

但是程序不会有效,提示this 关键字没有被定义,why?

Because, this 和Ruby中的self相似 ,常常代表了当前类的实例对象,但有例外event handler.

解释:

js的类和方法其实都是函数。当我们使用一个类的对象的方法时,这个方法就是一个函数,它的值会传给这个对象,但是当这个方法被一个事件处理器event handler调用时,this的意义就变化了。此时this所代表的对象不会被js发现。this在js中是一个复杂的原则concept.

为了确保this关键字被发现并因此设置为这个对象,我们要调用bind方法捆绑。

this.onPayTypeSelected = this.onPayTypeSelected.bind(this);

js 类有建筑器(也就是构造函数) :Js classes have constructors, just like Ruby classes, and that is the rigth location to execute this code(指上面那行代码).

React 组件构造函数 接收一个参数props,并把这个参数传给它的超类superclass.同时,我们也需要初始化initialize我们的状态state. 看全部点击->(代码

  constructor(props) {
super(props);
this.onPayTypeSelected = this.onPayTypeSelected.bind(this);
this.state = { selectedPayType: null };
}

在render代码块中,我们可以使用this.state.selectedPayType属性得到value.

现在,声明一个客制组件,基于

4-13 Webpacker-React.js; 用React做一个下拉表格的功能: <详解>的更多相关文章

  1. swift 第九课 用tableview 做一个下拉菜单Menu

    写到这里的时候,自己这个项目已经完成了一半左右,项目进度自己还是挺满意.今天又有一个新的布局,要实现个下拉菜单,刚开始写的时候,觉得会很容易,后来发现也是小错不断, 我想自己限制的自己属于写博客的初期 ...

  2. WHAT IS THE DIFFERENCE BETWEEN REACT.JS AND REACT NATIVE?

    Amit Ashwini - 09 SEPTEMBER 2017 React.js was developed by Facebook to address its need for a dynami ...

  3. react.js 实现音乐播放、下一曲、以及删除歌曲(仅播放列表)

    import React, { Component } from 'react'; export default class Music extends Component {   construct ...

  4. [转]js中几种实用的跨域方法原理详解

    转自:js中几种实用的跨域方法原理详解 - 无双 - 博客园 // // 这里说的js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同 ...

  5. 使用 jquery 的 上传文件插件 uploadify 3.1 配合 java 来做一个简单的文件上次功能。并且在界面上有radio 的选择内容也要上传

    使用 jquery 的 上传文件插件 uploadify 3.1 配合 java 来做一个简单的文件上次功能.并且在界面上有radio 的选择内容也要上传 uploadify 插件的 下载和文档地址  ...

  6. JS 获取select(多选下拉)中所选值的示例代码

    通过js获取select(多选下拉)中所选值,具体实现如下,有需要的朋友可以参考下,希望对大家有所帮助 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML ...

  7. js基础--浏览器标签页隐藏或显示状态 visibility详解

    欢迎访问我的个人博客:http://www.xiaolongwu.cn 前言 在工作中我们可能会遇到这样的需求,当浏览器切换到别的标签页或着最小化时,我们需要暂停页面上正在播放的视频或者音乐,这个需求 ...

  8. js实现可输入的下拉框

    <HTML> <HEAD> <META http-equiv='Content-Type' content='text/html; charset=gb2312'> ...

  9. Vue.js中使用select选择下拉框

    在Vue.js中使用select选择下拉框有两种方法: 第一种: Add.html: <select v-model="sysNotice.noticeType" id=&q ...

随机推荐

  1. 浅谈为什么一个java源文件中只能有一个public类?

    声明,本篇文章为转载 转载 http://blog.csdn.net/bareheadzzq/article/details/6562211 最近在一个java文件中实现了几个类,其中一个声明为pub ...

  2. 【tensorflow】pip 安装失败的原因

    linux系统旧版本:   pip install https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.5.0-cp27- ...

  3. java接口对接——别人调用我们接口获取数据

    java接口对接——别人调用我们接口获取数据,我们需要在我们系统中开发几个接口,给对方接口规范文档,包括访问我们的接口地址,以及入参名称和格式,还有我们的返回的状态的情况, 接口代码: package ...

  4. php CI 实战教程第一季百度经验杂志

    phpCI实战教程第一季_百度经验杂志_百度经验http://jingyan.baidu.com/magazine/16428 杂志为本人php CI实战教程系列经验 从实际项目使用中写系列实战经验, ...

  5. oracle计算过程执行时间写法

    --在oracle写过程中很多是对数据处理,业务比较繁琐,有的需要结合job定时器使用,这样就需要知道执行过程的大概时间,不废话直接上脚本,统计单位为分钟 PROCEDURE DATA_DEAL_WI ...

  6. Python之路----列表推导式和生成器的表达式

    列表推导式 egg_list=['鸡蛋%s'%i for i in range(10)] print(egg_list) 列表推导式 推导过程 egg_list = [] for i in range ...

  7. 【前端开发】利用Fiddler抓包工具进行本地调试

    解决什么问题: 解决前端在本地联调页面 || 样式 || 脚本时经常修改服务器代码,浪费太多时间. 避免多人同时修改代码产生冲突问题.可以在本地调完代码之后,再贴到服务器上. 其实这个问题老早就开始想 ...

  8. Python入门之字典的操作详解

    这篇文章主要介绍了Python 字典(Dictionary)的详细操作方法,需要的朋友可以参考下: Python字典是另一种可变容器模型,且可存储任意类型对象,如字符串.数字.元组等其他容器模型. 一 ...

  9. HTML 和 JavaScript 编写简单的 404 界面

    编写简单的 404 界面,也可以用来做 500 报错界面,还会飘东西,特别好,蛮漂亮的! <!DOCTYPE html> <html> <head> <met ...

  10. 04: 使用BeautifulSoup封装的xss过滤模块

    目录: 1.1 xss攻击简介 1.2 xss攻击解决方法 1.1 xss攻击简介返回顶部 1.简介 1. 跨站脚本(cross site script)为了避免与样式css混淆,所以简称为XSS. ...