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. VMWare中桥接、NAT、Host-only

    1.概述 2.bridged(桥接模式) 3.NAT(网络地址转换模式) 4.host-only(主机模式) 5.replicate physical network connection state ...

  2. javascript中的console.log有什么作用?

    javascript中的console.log有什么作用? 主要是方便你调式javascript用的.你可以看到你在页面中输出的内容. 相比alert他的优点是:他能看到结构话的东西,如果是alert ...

  3. Struts2快速后台验证 使用

    为了和前台基于JavaScript的开源验证框架RapidValidation使用统一的验证规则, 最大限度的减少重复的后台验证代码, 使用方式简便, 扩展方便. https://blog.csdn. ...

  4. SNMP学习笔记之Linux服务器SNMP常用OID

    收集整理一些Linux下snmp常用的OID,用做服务器监控很不错. 应用示例 查看服务器1分钟平均负载: snmpwalk -v1 -c public 127.0.0.1 .1.3.6.1.4.1. ...

  5. Jsp中如何通过Jsp调用Java类中的方法

    Jsp中如何通过Jsp调用Java类中的方法 1.新建一个项目,在src文件夹下添加一个包:如:cn.tianaoweb.com; 2.再在包中添加一个类:如 package com; public ...

  6. CentOS 7 怎样自动连接网络

    https://jingyan.baidu.com/article/19192ad8f7c320e53e570728.html

  7. 20145127《java程序设计》第十周学习总结

    Java的网络编程 1.计算机网络概述 (1)路由器和交换机组成了核心的计算机网络,计算机只是这个网络上的节点以及控制等,通过光纤.网线等连接将设备连接起来,从而形成了一张巨大的计算机网络. (2)网 ...

  8. cogs 2223. [SDOI2016 Round1] 生成魔咒

    ★★☆ 输入文件:menci_incantation.in 输出文件:menci_incantation.out 简单对比 时间限制:1 s 内存限制:128 MB [题目描述]魔咒串由许多魔咒字符组 ...

  9. Python3基础 tuple 创建空元组或者只有一个元素的元组 并 用乘法成倍扩充

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  10. 用GDB调试Segmentation 段错误【转】

    本文转载自:http://blog.csdn.net/learnhard/article/details/4879834 调试Linux程序的时候,出现Segmentation Fault是最郁闷的事 ...