reactpy v2.0.0b3
Pre-release
Pre-release
·
1 commit
to main
since this release
Summary
Welcome to the final beta release of ReactPy v2, which brings ReactPy Standalone Mode, and ReactPy ASGI Middleware!
You can give this version a try by typing pip install reactpy[asgi]==2.0.0b3.
Here is a quick demo of the new ReactPy Standalone mode:
# FILENAME: example.py
from reactpy import component, html
from reactpy.executors.asgi import ReactPy
@component
def ExampleComponent():
return html.div("Hello World")
app = ReactPy(ExampleComponent)
# Now you can run `uvicorn example:app --reload` to start ReactPy!Here is a quick demo of the new ReactPy Middleware mode (using Starlette for demonstration purposes):
# FILENAME: example.py
from starlette.applications import Starlette
from starlette.routing import Route
from starlette.templating import Jinja2Templates
from reactpy.executors.asgi import ReactPyMiddleware
# You will need to follow your framework's guidelines on installing Jinja extensions
# When our new Jinja extension is installed, the `{% component "example.path" %}` tag will be available in any Jinja template.
# The template tag currently accepts a single argument, which is the dotted path to the component.
# For example {% component "my_package.ExampleComponent" %}
templates = Jinja2Templates(
directory="templates",
extensions=["reactpy.templatetags.Jinja"],
)
async def homepage(request):
return templates.TemplateResponse(request, "index.html")
app = ReactPyMiddleware(
Starlette(routes=[Route("/", homepage)]),
# Register components with ReactPy to allow them to be used as a root component in your templates
root_components=["my_package.ExampleComponent"],
)
# Now you can run `uvicorn example:app --reload` to start ReactPy!Changelog
Added
- Added
reactpy.executors.asgi.ReactPythat can be used to run ReactPy in standalone mode via ASGI. - Added
reactpy.executors.asgi.ReactPyCsrthat can be used to run ReactPy in standalone mode via ASGI, but rendered entirely client-sided. - Added
reactpy.executors.asgi.ReactPyMiddlewarethat can be used to utilize ReactPy within any ASGI compatible framework. - Added
reactpy.templatetags.ReactPyJinjathat can be used alongsideReactPyMiddlewareto embed several ReactPy components into your existing application. This includes the following template tags:{% component %},{% pyscript_component %}, and{% pyscript_setup %}. - Added
reactpy.pyscript_componentthat can be used to embed ReactPy components into your existing application. - Added
asgiandjinjainstallation extras (for examplepip install reactpy[asgi, jinja]). - Added support for Python 3.12 and 3.13.
- Added
reactpy.use_async_effecthook. - Added
shutdown_timeoutparameter to thereactpy.use_async_effecthook. reactpy.htmlwill now automatically flatten lists recursively (ex.reactpy.html(["child1", ["child2"]]))- Added
reactpy.Vdomprimitive interface for creating VDOM dictionaries. - Added type hints to
reactpy.htmlattributes. - Added support for nested components in web modules
- Added support for inline JavaScript as event handlers or other attributes that expect a callable via
reactpy.types.InlineJavaScript - Added
reactpy.web.reactjs_component_from_fileto import ReactJS components from a file. - Added
reactpy.web.reactjs_component_from_urlto import ReactJS components from a URL. - Added
reactpy.web.reactjs_component_from_stringto import ReactJS components from a string. - Event functions can now call
event.preventDefault()andevent.stopPropagation()methods directly on the event data object, rather than using the@eventdecorator. - Event data now supports accessing properties via dot notation (ex.
event.target.value).
Changed
- Substitute client-side usage of
reactwithpreact. - Script elements no longer support behaving like effects. They now strictly behave like plain HTML script elements.
- The
reactpy.htmlmodule has been modified to allow for auto-creation of any HTML nodes. For example, you can create a<data-table>element by callinghtml.data_table(). - Change
set_statecomparison method to check equality with==more consistently. - Add support for rendering
@componentchildren withinvdom_to_html. - Renamed the
use_locationhook'ssearchattribute toquery_string. - Renamed the
use_locationhook'spathnameattribute topath. - Renamed
reactpy.config.REACTPY_DEBUG_MODEtoreactpy.config.REACTPY_DEBUG. @reactpy/clientnow exportsReactandReactDOM.- ReactPy no longer auto-converts
snake_caseprops tocamelCase. It is now the responsibility of the user to ensure that props are in the correct format. reactpy.utils.reactpy_to_stringwill now retain the user's original casing fordata-*andaria-*attributes.reactpy.utils.string_to_reactpyhas been upgraded to handle more complex scenarios without causing ReactJS rendering errors.reactpy.core.vdom._CustomVdomDictConstructorhas been moved toreactpy.types.CustomVdomConstructor.reactpy.core.vdom._EllipsisReprhas been moved toreactpy.types.EllipsisRepr.reactpy.types.VdomDictConstructorhas been renamed toreactpy.types.VdomConstructor.- Rewrite the
event-to-objectpackage to be more robust at handling properties on events.
Deprecated
reactpy.web.exportis deprecated. Usereactpy.web.reactjs_component_from_*instead.reactpy.web.module_from_fileis deprecated. Usereactpy.web.reactjs_component_from_fileinstead.reactpy.web.module_from_urlis deprecated. Usereactpy.web.reactjs_component_from_urlinstead.reactpy.web.module_from_stringis deprecated. Usereactpy.web.reactjs_component_from_stringinstead.
Removed
- Removed the ability to import
reactpy.html.*elements directly. You must now callhtml.*to access the elements. - Removed
reactpy.samplemodule. - Removed
reactpy.svgmodule. Contents previously withinreactpy.svg.*can now be accessed viahtml.svg.*. - Removed
reactpy.html._function. Usehtml.fragmentinstead. - Removed
reactpy.run. See the documentation for the new method to run ReactPy applications. - Removed
reactpy.backend.*. See the documentation for the new method to run ReactPy applications. - Removed
reactpy.core.typesmodule. Usereactpy.typesinstead. - Removed
reactpy.utils.html_to_vdom. Usereactpy.utils.string_to_reactpyinstead. - Removed
reactpy.utils.vdom_to_html. Usereactpy.utils.reactpy_to_stringinstead. - Removed backend specific installation extras (such as
pip install reactpy[starlette]). - Removed deprecated function
module_from_template. - Removed support for Python 3.9.
- Removed support for async functions within
reactpy.use_effecthook. Usereactpy.use_async_effectinstead. - Removed
reactpy.vdom. Usereactpy.Vdominstead. - Removed
reactpy.core.make_vdom_constructor. Usereactpy.Vdominstead. - Removed
reactpy.core.custom_vdom_constructor. Usereactpy.Vdominstead.
Fixed
- Fixed a bug where script elements would not render to the DOM as plain text.
- Fixed a bug where the
keyproperty provided within server-side ReactPy code was failing to propagate to the front-end JavaScript components. - Fixed a bug where
RuntimeError("Hook stack is in an invalid state")errors could be generated when using a webserver that reuses threads.